超级和子类共享变量

时间:2014-04-25 08:33:11

标签: python oop inheritance

请考虑以下代码段

class super1():
    def __init__(self):
        self.variable = ''

    def setVariable(self, value):
        self.variable = value

class child(super1):
    def __init__(self):
        super.__init__(self)
        self.setSuperVariable()

    def setSuperVariable(self):
        # according to this variable should have value 10
        self.setVariable(10)

super_instance = super1()
child1 = child()

print super_instance.variable
# prints nothing

super_instance.setVariable(20)
print super_instance.variable

如您所见,我有一个基类和一个派生类。我希望派生类设置"变量"也可以在程序之外使用。例如,子类正在执行复杂的任务并设置变量,该变量将被其他类和函数使用。

但截至目前,由于子类具有自己的实例,因此它不会反映在范围之外。

此问题是否有解决方法?

@ Elmo

class super():
    def __init__(self):
        self.variable = ''

    def setVariable(self, value):
        self.variable = value

class child():
    def __init__(self, instance_of_super):
        self.handle = instance_of_super
        self.setSuperVariable()

    def setSuperVariable(self):
        # according to this variable should have value 10
        self.handle.setVariable(10)

super_instance = super()
child1 = child(super_instance)

print super_instance.variable
# prints nothing

super_instance.setVariable(20)
print super_instance.variable

这将设置变量。虽然我不使用继承。 :)

1 个答案:

答案 0 :(得分:0)

修改子实例时,super1实例中的变量不会更改,因为继承在类级别工作。创建实例后,它将自己及其父项的所有内容。每个实例彼此完全独立,一个实例中的更改不会反映在另一个实例上。

你可以通过类属性获得那种副作用,而这就是你想要的,你根本不需要继承:

class MyClass:
    class_attribute = None

    @classmethod
    def set(cls, value):
        cls.class_attribute = value

    def do_computation(self):
        self.set(10)


a = MyClass()
b = MyClass()
print a.class_attribute
print b.class_attribute

a.do_computation()
print a.class_attribute
print b.class_attribute

输出结果为:

None
None
10
10