Python继承的基类变量

尼尔斯

所以我有Base两个孩子班。我的想法是,我将拥有一个包含所有可以插入到一个子类中的数据的模型。然后调用一个方法在每个子类上设置标题,然后将数据从复制ModelChild类实例。但是我发现,add_header在第一个类实例上调用方法(在本例中为a)之后,b也获得了标头。哪一种让我感到困惑,因为我认为初始化的类不会互相影响。我的问题是为什么会这样,并且可以避免吗?

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']
德米特里

“在第一个类实例上调用add_header方法(在本例中为a)之后,b也获得了标头”,因为两个实例共享相同的变量标头。标头应该是实例而不是变量

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__问题中的属性与问题无关。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章