加上等于python中的子类

时间:2012-12-31 18:15:07

标签: python subclass

我希望能够在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()一起使用。

2 个答案:

答案 0 :(得分:6)

你无法做你想做的事。这些是Python设计的有意义方面。

你不能这样做:

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

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

您无法找到使其与super一起使用的方法。原因是super至少需要一个类型作为参数,但在您想要使用它的时候(在b的定义内),b尚不存在。因此,您无法将其提交给super()

最后,你回答了自己的问题。你正在做正确的事,因为explicit is better than implicit

答案 1 :(得分: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