[英]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.