内部类覆盖类属性



我有一个包含以下代码的Python脚本:

class Parent:
def __init__(self, name):
self.name = name
class Child:
def __init__(self, name):
self.name = name
def print_relationship(self):
print(f'{self.name} is {self.Child.name}'s parent')

myObj_1 = Parent('John')
myObj_1.Child.name = 'Steve'
myObj_2 = Parent('Stan')
myObj_2.Child.name = 'Oliver'
myObj_1.print_relationship()
myObj_2.print_relationship()

返回:

>>>约翰是奥利弗的父母

>>>斯坦是奥利弗的父母

但是,我期待以下结果:

>>>约翰是史蒂夫的父母

>>>斯坦是奥利弗的父母

这是继承问题吗?糟糕的设计?双?

-编辑-糟糕的设计是答案。

Child代表一般的孩子。全局定义它。Parent的每个实例都应存储Child实例的引用。(这种情况可能不是唯一的;一个孩子可能有多个父母。

class Child:
def __init__(self, name):
self.name = name
class Parent:
def __init__(self, name, child=None):
self.name = name
self.child = child
def print_relationship(self):
print(f'{self.name} is {self.child.name}'s parent')

oliver = Child('Oliver')
myObj_1 = Parent('John', Child('Steve'))
myObj_2 = Parent('Stan', oliver)
myObj_3 = Parent('Jane', oliver)
myObj_1.print_relationship()
myObj_2.print_relationship()

当然,父母可以有多个孩子:

class Parent:
def __init__(self, name, children=None):
self.name = name
if children is None:
children = []
self.children = children
def print_relationship(self):
for child in self.children:
print(f'{self.name} is {child.name}'s parent')

myObj1 = Parent('Bob', [Child('Alice'), Child('Chloe')])

在第myObj_1.Child.name = 'Steve'行中,您将在类上创建一个名为name的类属性Child并分配Steve的值。此名称不同于行self.name = name中的实例属性,后者只能由类 Child 的实例访问。

执行myObj_2.Child.name = 'Oliver'时,类的类属性name的值Child更改。

print_relationship中,你指的是self.Child.name,它指的是子类的类属性name

最新更新