相关疑难解决方法(0)

在派生类中调用super()时,我可以传入self .__ class__吗?

我最近发现(通过StackOverflow)调用基类中的方法我应该调用:

super([[derived class]], self).[[base class method]]()

没关系,它有效.但是,当我进行更改时,我发现自己经常在类之间复制和粘贴,而且我经常忘记将派生类参数修复为super()函数.

我想避免记得更改派生类参数.我可以改为使用self.__class__super()函数的第一个参数吗?

它似乎有用,但有充分的理由我不应该这样做吗?

python super python-2.7

47
推荐指数
2
解决办法
8325
查看次数

Python覆盖没有setter的getter

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可能吗?

python oop getter setter properties

26
推荐指数
1
解决办法
5878
查看次数

在使用@property装饰器时,在属性的setter方法中使用super()会引发AttributeError

尝试覆盖子类中的属性时,我对此行为有点困惑.

第一个例子设置了两个类,ParentChild. Parent继承自object,而Child继承自Parent.该属性a是使用属性装饰器定义的.当child.a调用setter方法时,AttributeError会引发a.

在第二个例子中,通过使用property()函数而不是装饰器,一切都按预期工作.

谁能解释为什么行为不同?此外,是的,我知道__init__不需要Child 中的定义.

例1 - 使用 @property

class 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)

python python-2.7

10
推荐指数
1
解决办法
2929
查看次数

标签 统计

python ×3

python-2.7 ×2

getter ×1

oop ×1

properties ×1

setter ×1

super ×1