如何在python中创建一个覆盖变量的类的基类?

时间:2014-08-06 09:54:01

标签: python

假设这个例子:

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个对象?

2 个答案:

答案 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