이 속성이 파생 클래스에서 덮어 쓰는 경우 기본 클래스의 속성을 호출하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1021464

문제

나는 광범위한 getters and setters의 광범위한 사용에서 더 많은 부동산을 바꾸고 있습니다.

그러나 이제 나는 이전의 getters 또는 setter 중 일부가 기본 클래스의 해당 방법을 호출 한 다음 다른 것을 수행하기 때문에 갇혀 있습니다. 그러나 이것이 속성으로 어떻게 달성 될 수 있습니까? 부모 수업에서 속성 getter 또는 setter를 호출하는 방법은 무엇입니까?

물론 속성 자체를 호출하면 무한한 재귀가 생깁니다.

class Foo(object):

    @property
    def bar(self):
        return 5

    @bar.setter
    def bar(self, a):
        print a

class FooBar(Foo):

    @property
    def bar(self):
        # return the same value
        # as in the base class
        return self.bar # --> recursion!

    @bar.setter
    def bar(self, c):
        # perform the same action
        # as in the base class
        self.bar = c    # --> recursion!
        # then do something else
        print 'something else'

fb = FooBar()
fb.bar = 7
도움이 되었습니까?

해결책

속성에 의해 호출되는 기본 클래스 함수를 호출 할 수 있다고 생각할 수 있습니다.

class FooBar(Foo):

    @property
    def bar(self):
        # return the same value
        # as in the base class
        return Foo.bar(self)

이것은 내가 생각하는 가장 분명한 일이지만 - 바는 부동산이 아니기 때문에 작동하지 않습니다.

그러나 속성은 단지 객체 일 뿐이며, 해당 속성을 찾을 수있는 getter 방법이 있습니다.

class FooBar(Foo):

    @property
    def bar(self):
        # return the same value
        # as in the base class
        return Foo.bar.fget(self)

다른 팁

감독자 트릭을 수행해야합니다.

return super().bar

Python 2.X에서는 더 장황한 구문을 사용해야합니다.

return super(FooBar, self).bar

대안을 사용하는 것이 있습니다 super 기본 클래스 이름을 명시 적으로 참조 할 필요는 없습니다.

Base class A:

class A(object):
    def __init__(self):
        self._prop = None

    @property
    def prop(self):
        return self._prop

    @prop.setter
    def prop(self, value):
        self._prop = value

class B(A):
    # we want to extend prop here
    pass

B에서 부모 클래스 A의 속성 getter에 액세스 :

다른 사람들이 이미 대답했듯이 : 그것은 다음과 같습니다.

super(B, self).prop

또는 Python 3에서 :

super().prop

이것은 재산의 getter가 반환 한 값을 반환합니다. Getter 자체가 아니라 Getter를 확장하기에 충분합니다.

B에서 부모 클래스 A의 속성 세터에 액세스 :

내가 지금까지 본 가장 좋은 권장 사항은 다음과 같습니다.

A.prop.fset(self, value)

나는 이것이 더 낫다고 믿는다 :

super(B, self.__class__).prop.fset(self, value)

이 예에서는 두 옵션이 모두 동일하지만 Super를 사용하는 것은 기본 클래스와 독립적이라는 이점이 있습니다. B. 만약에 B a C 클래스도 속성을 확장하면 업데이트 할 필요가 없습니다. B코드.

A의 속성을 확장하는 B의 전체 코드 :

class B(A):
    @property
    def prop(self):
        value = super(B, self).prop
        # do something with / modify value here
        return value

    @prop.setter
    def prop(self, value):
        # do something with / modify value here
        super(B, self.__class__).prop.fset(self, value)

하나의 경고 :

귀하의 속성에 세터가 없으면 세터와 getter를 모두 정의해야합니다. B 당신이 그들 중 하나의 행동 만 바꾸더라도.

노력하다

@property
def bar:
    return super(FooBar, self).bar

Python이 기본 클래스 속성 호출을 지원하는지 확실하지 않지만. 속성은 실제로 지정된 함수로 설정된 호출 가능한 객체입니다. 그런 다음 클래스에서 해당 이름을 대체합니다. 이것은 사용 가능한 슈퍼 기능이 없음을 쉽게 의미 할 수 있습니다.

그러나 항상 구문을 전환하여 속성 () 함수를 사용하여 다음과 같습니다.

class Foo(object):

    def _getbar(self):
        return 5

    def _setbar(self, a):
        print a

    bar = property(_getbar, _setbar)

class FooBar(Foo):

    def _getbar(self):
        # return the same value
        # as in the base class
        return super(FooBar, self)._getbar()

    def bar(self, c):
        super(FooBar, self)._setbar(c)
        print "Something else"

    bar = property(_getbar, _setbar)

fb = FooBar()
fb.bar = 7
    class Base(object):
      def method(self):
        print "Base method was called"

    class Derived(Base):
      def method(self):
        super(Derived,self).method()
        print "Derived method was called"

    d = Derived()
    d.method()

(당신의 설명에서 무언가를 놓치지 않는 한)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top