我希望能够+=
与 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()
。
你不能做你想做的事。这些是 Python 设计的有意方面。
你不可以做这个:
class a():
a = 2
class b(a):
a += 4
因为最后一行没有a
范围。您必须明确说明a
可以找到的名称空间。
您将找不到使其与super
. 原因是super
至少需要一个类型作为参数,但在您想要使用它的点(在 的定义内b
),b
还不存在。所以,你不能把它交给super()
.
最后,你回答了你自己的问题。您正在做正确的事情,因为显式优于隐式。
@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
明确使用。