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