0

我希望能够+=与 python 中的子类一起使用。也就是说,我希望能够+=在 python 中附加到超类中的值:

class a():
  a = 2
class b(a):
  a += 4

b = b()

assert b.a == 6

我知道我可以这样做

class b(a):
  a = a.a + 4

但我想以更简洁的方式做到这一点。另外,我似乎无法使用上述内容super()

4

2 回答 2

6

你不能做你想做的事。这些是 Python 设计的有意方面。

你不可以做这个:

class a():
    a = 2
class b(a):
    a += 4

因为最后一行没有a范围。您必须明确说明a可以找到的名称空间。

您将找不到使其与super. 原因是super至少需要一个类型作为参数,但在您想要使用它的点(在 的定义内b),b还不存在。所以,你不能把它交给super().

最后,你回答了你自己的问题。您正在做正确的事情,因为显式优于隐式

于 2012-12-31T18:25:54.153 回答
1

@Phil Frost 是对的,你不能使用你想要的直接语法来做到这一点。但是,您可以使用类装饰器。这在定义类之后运行,因此它可以访问超类的变量。但是,您将不得不使用稍微繁琐的语法。这是一种可能性:

class InheritedPlus(object):
    def __init__(self, toAdd):
        self.toAdd = toAdd

def addInherited(cls):
    for attr, val in vars(cls).iteritems():
        if isinstance(val, InheritedPlus):
            setattr(cls, attr, getattr(super(cls, cls), attr)+val.toAdd)
    return cls

class A(object):
    x = 2

@addInherited
class B(A):
    x = InheritedPlus(3)

>>> B.x
5

这不允许您使用+=,但它确实可以让您获得在基于超类值的子类中创建类属性的效果。更聪明一点,您可以创建一个通用Inherited()类来实现各种运算符并存储操作数,以允许x = Inherited() + 3.

我认为有一些合法的用例可以在类定义时访问超类属性,这种方法可以解决这个问题。但是,如果您只有一个像示例中那样的简单案例,则可能不值得这种复杂程度,您应该a.a + 4明确使用。

于 2012-12-31T19:25:04.927 回答