我有一个包含以下代码的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
。