簡體   English   中英

不使用setter的Python覆蓋getter

[英]Python overriding getter without setter

class human(object):
    def __init__(self, name=''):
        self.name = name

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        self._name = value

class superhuman(human):
    @property
    def name(self):
        return 'super ' + name

s = superhuman('john')
print s.name

# Doesn't work :( "AttributeError: can't set attribute"
s.name = 'jack'
print s.name

我希望能夠重寫該屬性,但能夠使用超級父級的setter,而不必重寫子類中的setter。

pythonicaly有可能嗎?

使用原始屬性的.getter裝飾器:

class superhuman(human):
    @human.name.getter
    def name(self):
        return 'super ' + self._name

請注意,您必須使用全名才能到達父類上的原始屬性描述符。

示范:

>>> class superhuman(human):
...     @human.name.getter
...     def name(self):
...         return 'super ' + self._name
... 
>>> s = superhuman('john')
>>> print s.name
super john
>>> s.name = 'jack'
>>> print s.name
super jack

property描述符對象只是一個對象,即使它可以具有與其關聯的多種方法(getter,setter和deleter)。 現有property描述符提供的.getter.setter.deleter裝飾器函數返回描述符本身的副本,但該特定方法已替換。

因此,在human基類中,發生的事情是,首先使用@property裝飾器創建了描述符,然后使用同時具有@name.setter@name.setter語法的setter替換了該描述符。 這是name = name.setter(name) ,因為python裝飾name = name.setter(name)相同的名稱替換了原始裝飾的函數,它基本上執行name = name.setter(name) 請參見@property裝飾器如何工作? 有關所有工作原理的詳細信息。

在您的子類中,您只需使用該技巧就可以創建描述符的新副本,而只需替換getter。

暫無
暫無

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

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