所以我有带有两个子类的Base
类。我的想法是,我将拥有一个包含所有数据的模型,我可以将其插入到子类之一中。然后调用一个方法来设置每个子类的 header ,然后将数据从 Model
复制到 Child
类实例。但是我发现在第一个类实例(本例中为 a)上调用 add_header 方法后,b 也获得了 header 。这让我有点困惑,因为我认为启动的类(class)不会互相影响。我的问题是为什么会出现这种情况以及是否可以避免?
class Base(object):
__model__ = None
headers = ['base_header','base_header2']
def add_header(self, *args):
for h in args:
self.headers.append(h)
def set_header_values(self):
for h in self.headers:
setattr(self, h, getattr(self.__model__, h))
class ChildOne(Base):
def __init__(self, model):
self.__model__ = model
class ChildTwo(Base):
def __init__(self, model):
self.__model__ = model
class Model(object):
foo = 'bar'
m = Model()
a = ChildOne(m)
b = ChildTwo(m)
a.add_header('tralala')
print b.headers // Output ['base_header','base_header2','tralala']
最佳答案
“在第一个类实例(本例中为 a)上调用 add_header 方法后,b 也获得了 header ” 因为两个实例共享相同的变量头。 header 应该是实例而不是类变量
class Base(object):
__model__ = None
def __init__(self):
self.headers = []
def add_header(self, *args):
for h in args:
self.headers.append(h)
def set_header_values(self):
for h in self.headers:
setattr(self, h, getattr(self.__model__, h))
class ChildOne(Base):
def __init__(self, model):
super(ChildOne, self).__init__()
self.__model__ = model
class ChildTwo(Base):
def __init__(self, model):
super(ChildTwo, self).__init__()
self.__model__ = model
class Model(object):
foo = 'bar'
m = Model()
a = ChildOne(m)
b = ChildTwo(m)
a.add_header('tralala')
print a.headers
print b.headers
输出
['tralala']
[]
附加说明
Python 类和实例变量会导致困惑。考虑以下示例:
class A:
l =[]
class B:
l =[]
x = A()
y = A()
x.l.append(1)
print 'class A ', A.l, x.l, y.l
x = B()
y = B()
x.l = [1]
print 'class B ', B.l, x.l, y.l
输出
class A [1] [1] [1]
class B [] [1] []
两个示例都使用非常相似的对数据成员“l”的访问,但是第一个示例修改了现有的类变量,而第二个示例创建了一个新的实例变量。
在您的示例中,如果您有一个赋值 self.headers = [...]
而不是 self.append(...)
您的输出将会有所不同。
此外,您问题中的 __model__
属性与问题无关。
关于Python继承基类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24219563/