簡體   English   中英

python3:覆蓋屬性的setter

[英]python3: overriding setter of a property

class Base:
    def __init__(self):
        self._prop = None
        pass

    def get_prop(self):
        print('base get prop')
        return self._prop

    def set_prop(self, prop):
        print('base set prop')
        self._prop = prop

    prop = property(get_prop, set_prop)
    pass


class Derived(Base):
    def set_prop(self, prop):
        print('Derived set prop')
        self._prop = prop
    pass


base = Base()
base.prop = 1
print(base.prop)

derive = Derived()
derive.prop = 1
print(derive.prop)

結果:

base set prop
base get prop
1
base set prop
base get prop
1

由於我在派生類中重寫了它,因此期望獲得Derived set prop

當我用@Base.prop.setter搜索時,我看到了@Base.prop.setter注釋。 我也嘗試過,但是沒有用。 我認為這是因為他們創建Base prop方式不同。

但是在這種情況下,我無法輕松更新Base類。

一種方法是在Derive類中完全重新實現prop ,但我知道這不是正確的方法。 還有另一種方法嗎?

這是因為當您使用property(get_prop, set_prop)分配給Base.prop時,此property對象將使用Base類中定義的set_prop函數對象實例化。 Derived類繼承Base類的事實並不能神奇地更新對property對象中Base.set_prop方法的引用。

您可以在Derived類中定義另一個prop

class Derived(Base):
    def set_prop(self, prop):
        print('Derived set prop')
        self._prop = prop

    prop = property(Base.get_prop, set_prop)

或者您可以簡單地使用property作為裝飾器:

class Base:
    def __init__(self):
        self._prop = None
        pass

    @property
    def prop(self):
        print('base get prop')
        return self._prop

    @prop.setter
    def prop(self, prop):
        print('base set prop')
        self._prop = prop

class Derived(Base):
    @Base.prop.setter
    def prop(self, prop):
        print('Derived set prop')
        self._prop = prop

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM