[PYTHON] 파이썬 상속 - 함수 비활성화 방법
PYTHON파이썬 상속 - 함수 비활성화 방법
C ++에서는 자식 클래스에서 private 클래스로 선언하여 부모 클래스의 함수를 비활성화 할 수 있습니다. 어떻게 이것을 파이썬에서 할 수 있습니까? I.E. 자녀의 공용 인터페이스에서 부모 기능을 숨기려면 어떻게해야합니까?
해결법
-
==============================
1.실제로 파이썬에는 진정한 "private"속성이나 메소드가 없습니다. 당신이 할 수있는 한 가지는 단순히 서브 클래스에서 원하지 않는 메소드를 오버라이드하고 예외를 발생시키는 것입니다.
실제로 파이썬에는 진정한 "private"속성이나 메소드가 없습니다. 당신이 할 수있는 한 가지는 단순히 서브 클래스에서 원하지 않는 메소드를 오버라이드하고 예외를 발생시키는 것입니다.
>>> class Foo( object ): ... def foo( self ): ... print 'FOO!' ... >>> class Bar( Foo ): ... def foo( self ): ... raise AttributeError( "'Bar' object has no attribute 'foo'" ) ... >>> b = Bar() >>> b.foo() Traceback (most recent call last): File "<interactive input>", line 1, in <module> File "<interactive input>", line 3, in foo AttributeError: 'Bar' object has no attribute 'foo'
-
==============================
2.kurosch의 문제 해결 방법은 정확하지 않습니다. 왜냐하면 AttributeError를 얻지 않고 b.foo를 계속 사용할 수 있기 때문입니다. 이 함수를 호출하지 않으면 오류가 발생하지 않습니다. 이 작업을 수행 할 수있는 두 가지 방법은 다음과 같습니다.
kurosch의 문제 해결 방법은 정확하지 않습니다. 왜냐하면 AttributeError를 얻지 않고 b.foo를 계속 사용할 수 있기 때문입니다. 이 함수를 호출하지 않으면 오류가 발생하지 않습니다. 이 작업을 수행 할 수있는 두 가지 방법은 다음과 같습니다.
import doctest class Foo(object): """ >>> Foo().foo() foo """ def foo(self): print 'foo' def fu(self): print 'fu' class Bar(object): """ >>> b = Bar() >>> b.foo() Traceback (most recent call last): ... AttributeError >>> hasattr(b, 'foo') False >>> hasattr(b, 'fu') True """ def __init__(self): self._wrapped = Foo() def __getattr__(self, attr_name): if attr_name == 'foo': raise AttributeError return getattr(self._wrapped, attr_name) class Baz(Foo): """ >>> b = Baz() >>> b.foo() # doctest: +ELLIPSIS Traceback (most recent call last): ... AttributeError... >>> hasattr(b, 'foo') False >>> hasattr(b, 'fu') True """ foo = property() if __name__ == '__main__': doctest.testmod()
Bar는 "wrap"패턴을 사용하여 래핑 된 객체에 대한 액세스를 제한합니다. Martelli는 이것을 다루는 좋은 이야기를하고 있습니다. Baz는 내장 된 속성을 사용하여 속성이 재정의 할 설명자 프로토콜을 구현합니다.
-
==============================
3.kurosch의 답변에 대한 변형 :
kurosch의 답변에 대한 변형 :
class Foo( object ): def foo( self ): print 'FOO!' class Bar( Foo ): @property def foo( self ): raise AttributeError( "'Bar' object has no attribute 'foo'" ) b = Bar() b.foo
이 경우 메서드를 호출 할 때 대신 속성에서 AttributeError가 발생합니다.
나는 코멘트에서 그것을 제안했을 것이지만 불행히도 그것에 대한 명성이 아직 없습니다.
-
==============================
4.
class X(object): def some_function(self): do_some_stuff() class Y(object): some_function = None
이로 인해 예외가 발생하는 것을 지겹고 어렵게 만들 수 있으므로 다음과 같이 시도해 볼 수 있습니다.
class X(object): def some_function(self): do_some_stuff() class Y(object): def some_function(self): raise NotImplementedError("function some_function not implemented")
-
==============================
5.이것이 내가 아는 가장 깨끗한 방법입니다.
이것이 내가 아는 가장 깨끗한 방법입니다.
메소드를 오버라이드하고 오버라이드 된 각 메소드가 disabledmethods () 메소드를 호출하게하십시오. 이렇게 :
class Deck(list): ... @staticmethod def disabledmethods(): raise Exception('Function Disabled') def pop(self): Deck.disabledmethods() def sort(self): Deck.disabledmethods() def reverse(self): Deck.disabledmethods() def __setitem__(self, loc, val): Deck.disabledmethods()
from https://stackoverflow.com/questions/231839/python-inheritance-how-to-disable-a-function by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 범위 함수의 값 건너 뛰기 (0) | 2018.11.12 |
---|---|
[PYTHON] Cython 패키지와 __init __. pyx : 가능한가? (0) | 2018.11.12 |
[PYTHON] json.dumps (np.arange (5) .tolist ())가 작동하는 동안 json.dumps (list (np.arange (5)))가 실패하는 이유는 무엇입니까? (0) | 2018.11.12 |
[PYTHON] 파이썬에서 비트 필드 조작을 수행하는 가장 좋은 방법은 무엇입니까? (0) | 2018.11.12 |
[PYTHON] Python에서 JSON으로 직렬화가 10 진수에서 실패합니다 [duplicate] (0) | 2018.11.12 |