假设这个例子:
class A(object):
def add(self, number):
self.n += number
B = type("B", (A,), {"n":3})
b = B()
b.add(5)
b.n
此代码适用于我并在创建对象后返回b.n = 8或b.n = 3,但如果A类更改为
class A(object):
def__init__(self):
self.n = 0
def add(self, number):
self.n += number
B = type("B", (A,), {"n":3})
b = B()
b.add(5)
b.n
在这种情况下,b.n只有5,在创建对象之后,似乎n取自基类而不是新创建的类。有没有办法在对象B的创建时覆盖n个对象?
答案 0 :(得分:3)
作为type
的第三个参数传递的字典是类成员。也就是说,您的type
调用等同于:
class B(A):
n = 3
A.__init__
是继承的,它添加了一个实例变量。实例变量影子类变量,因此b.n
从0开始(而B.n
确实是3)。
请注意,继承是无关紧要的,下面的代码显示了相同的行为:
class B(object):
n = 3
def __init__(self):
self.n = 0
def add(self, number):
self.n += number
答案 1 :(得分:0)
@delnan解释为什么正在发生这种情况。
以下显示 你可以做你想做的事情:
class A(object):
def __init__(self):
self.n = 0
def add(self, number):
self.n += number
def create_B(initial_n):
class B(A):
def __init__(self):
self.n = initial_n
return B
B = create_B(3)
b = B()
b.add(5)
print b.n