복붙노트

[PYTHON] 파이썬 상속 - 함수 비활성화 방법

PYTHON

파이썬 상속 - 함수 비활성화 방법

C ++에서는 자식 클래스에서 private 클래스로 선언하여 부모 클래스의 함수를 비활성화 할 수 있습니다. 어떻게 이것을 파이썬에서 할 수 있습니까? I.E. 자녀의 공용 인터페이스에서 부모 기능을 숨기려면 어떻게해야합니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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()
    
  6. from https://stackoverflow.com/questions/231839/python-inheritance-how-to-disable-a-function by cc-by-sa and MIT license