使用继承在不同 类 之间共享数据
Sharing data between different classes using inheritance
我有许多不同的 classes 具有不同的职责,不共享任何方法。
但是,我想分享一些它们之间共有的变量。
为了实现这个目标,我选择了继承,但似乎并没有像我预期的那样工作。
在 中提出了一种不同的方法,但我不喜欢必须将所有实例传递给每个构造函数。
在我到目前为止所做的测试中,似乎 class 的每个实例都实例化了它自己的 superclass 实例。因此,classes 之间没有共享变量,而是在实例中拆分。
MWE 解释:
class Parent:
def __init__(self):
self.var1 = None
class Child1(Parent):
def __init__(self, var1):
super().__init__()
self.var1 = var1
class Child2(Parent):
def __init__(self, var1):
super().__init__()
self.var1 = var1
child1 = Child1(1)
child2 = Child2(2)
print(child1.var1) # prints 1
print(child2.var1) # prints 2
我是python的新手,看来我理解有误。
我期望的行为是两次 2
都会被打印,因为 child2
是最后实例化的,因此也为 child1
设置 var1=2
.
如何让子classes 共享相同的 superclass 实例和变量?我是否必须从 superclass 向下实例化而不是从 subclasses 向上实例化?
编辑:哎呀,对不起,我是初学者 Karl!猜猜我会检查作文然后..
您将 实例变量 误认为是 class 变量 。在这里,您定义了 实例变量 因为赋值是在 __init__
内部(实例的 初始化 )。
你想要的是定义一个class变量,像这样:
class Parent:
var1 = None
class Child1(Parent):
def __init__(self, var1):
super().__init__()
Parent.var1 = var1
class Child2(Parent):
def __init__(self, var1):
super().__init__()
Parent.var1 = var1
child1 = Child1(1)
child2 = Child2(2)
print(child1.var1) # prints 2 !! <-----
print(child2.var1) # prints 2
以前,每个实例都有自己的 var1
变量,根据定义,这就是 实例变量 。
但在我的示例中,var1
变量被定义到 class 对象 中。每个实例都可以引用它(使用 Parent.var1
),但它始终是同一个变量。但是 Python 很好,可以让你访问 class 变量 就像它们是 实例变量 一样,这可能会导致混淆。
但请记住,现在这就是 继承 的设计目的。是的,你可以这样使用,但有点不寻常。
我有许多不同的 classes 具有不同的职责,不共享任何方法。 但是,我想分享一些它们之间共有的变量。 为了实现这个目标,我选择了继承,但似乎并没有像我预期的那样工作。
在
在我到目前为止所做的测试中,似乎 class 的每个实例都实例化了它自己的 superclass 实例。因此,classes 之间没有共享变量,而是在实例中拆分。
MWE 解释:
class Parent:
def __init__(self):
self.var1 = None
class Child1(Parent):
def __init__(self, var1):
super().__init__()
self.var1 = var1
class Child2(Parent):
def __init__(self, var1):
super().__init__()
self.var1 = var1
child1 = Child1(1)
child2 = Child2(2)
print(child1.var1) # prints 1
print(child2.var1) # prints 2
我是python的新手,看来我理解有误。
我期望的行为是两次 2
都会被打印,因为 child2
是最后实例化的,因此也为 child1
设置 var1=2
.
如何让子classes 共享相同的 superclass 实例和变量?我是否必须从 superclass 向下实例化而不是从 subclasses 向上实例化?
编辑:哎呀,对不起,我是初学者 Karl!猜猜我会检查作文然后..
您将 实例变量 误认为是 class 变量 。在这里,您定义了 实例变量 因为赋值是在 __init__
内部(实例的 初始化 )。
你想要的是定义一个class变量,像这样:
class Parent:
var1 = None
class Child1(Parent):
def __init__(self, var1):
super().__init__()
Parent.var1 = var1
class Child2(Parent):
def __init__(self, var1):
super().__init__()
Parent.var1 = var1
child1 = Child1(1)
child2 = Child2(2)
print(child1.var1) # prints 2 !! <-----
print(child2.var1) # prints 2
以前,每个实例都有自己的 var1
变量,根据定义,这就是 实例变量 。
但在我的示例中,var1
变量被定义到 class 对象 中。每个实例都可以引用它(使用 Parent.var1
),但它始终是同一个变量。但是 Python 很好,可以让你访问 class 变量 就像它们是 实例变量 一样,这可能会导致混淆。
但请记住,现在这就是 继承 的设计目的。是的,你可以这样使用,但有点不寻常。