Python继承基类变量

标签 python class oop inheritance

所以我有带有两个子类的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/

相关文章:

java - 如何创建与给定对象属于同一类的对象

python - pyopenssl 验证文件签名

c# - 在列表中创建类实例

python - 继承上下文管理器的pythonic方式是什么

java - 无法在 Java 代码中引用类

javascript - 如何在Javascript中正确调用匿名函数的函数?

python - 父类运行方法

python/pylons - 模板的多个 Controller

python - 从列表交互中将数据插入 mysql 表的最佳方法

python - Beautifulsoup 多类选择器