内部类覆盖类属性

时间:2020-01-03 18:26:37

标签: python

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

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

这是继承问题吗?设计不好?都是吗?

-编辑-错误的设计是答案。

2 个答案:

答案 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