我有一个包含以下代码的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()
返回:
>>>约翰是奥利弗的父母
>>>斯坦是奥利弗的父母
但是,我期望得到以下结果:
>>> John是 Steve 的父母
>>>斯坦是奥利弗的父母
这是继承问题吗?设计不好?都是吗?
-编辑-错误的设计是答案。
答案 0 :(得分:1)
类Child
通常代表儿童。全局定义。 Parent
的每个实例应存储对Child
的 instance 的引用。 (该实例可能不是唯一的;一个孩子可能有多个父母。)
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')])
答案 1 :(得分:0)
在行myObj_1.Child.name = 'Steve'
中,您正在name
类上创建一个名为Child
的类属性,并分配Steve
的值。此名称不同于self.name = name
行中的instance属性,该属性只能由Child类的实例访问。
执行myObj_2.Child.name = 'Oliver'
时,name
类的类属性Child
的值将更改。
在print_relationship
中,您引用的是self.Child.name
,它引用了Child类的类属性name
。