我最近发现(通过StackOverflow)调用基类中的方法我应该调用:
super([[derived class]], self).[[base class method]]()
没关系,它有效.但是,当我进行更改时,我发现自己经常在类之间复制和粘贴,而且我经常忘记将派生类参数修复为super()函数.
我想避免记得更改派生类参数.我可以改为使用self.__class__super()函数的第一个参数吗?
它似乎有用,但有充分的理由我不应该这样做吗?
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
Run Code Online (Sandbox Code Playgroud)
我希望能够覆盖属性,但能够使用超级父级的setter而不必覆盖子类中的setter.
pythonicaly可能吗?
尝试覆盖子类中的属性时,我对此行为有点困惑.
第一个例子设置了两个类,Parent和Child. Parent继承自object,而Child继承自Parent.该属性a是使用属性装饰器定义的.当child.a调用setter方法时,AttributeError会引发a.
在第二个例子中,通过使用property()函数而不是装饰器,一切都按预期工作.
谁能解释为什么行为不同?此外,是的,我知道__init__不需要Child 中的定义.
@propertyclass Parent(object):
def __init__(self):
self._a = 'a'
@property
def a(self):
return self._a
@a.setter
def a(self, val):
self._a = val
class Child(Parent):
def __init__(self):
super(Child, self).__init__()
@property
def a(self):
return super(Child, self).a
@a.setter
def a(self, val):
val += 'Child'
super(Child, self).a = val
p = Parent()
c = Child()
print …Run Code Online (Sandbox Code Playgroud)