-1

我编写了以下代码来解释我使用 super() 发现的内容。:

使用 Parent.set_prop():

class Parent:
    parent_prop = None

    @classmethod
    def set_prop(cls, value):
        cls.parent_prop = value


class Child1(Parent):
    @classmethod
    def set_prop(cls, value):
        print("Child1 set parent prop")
        Parent.set_prop(value)


class Child2(Parent):
    pass


cls1 = Child1()
cls2 = Child2()
cls1.set_prop(10)

print(cls1.parent_prop)
print(cls2.parent_prop)

使用 super().set_prop()

class Parent:
    parent_prop = None

    @classmethod
    def set_prop(cls, value):
        cls.parent_prop = value


class Child1(Parent):
    @classmethod
    def set_prop(cls, value):
        print("Child1 set parent prop")
        super().set_prop(value)


class Child2(Parent):
    pass


cls1 = Child1()
cls2 = Child2()
cls1.set_prop(10)

print(cls1.parent_prop)
print(cls2.parent_prop)

第一次执行的结果是:

Child1 set parent prop
10
10

第二次执行的结果是:

Child1 set parent prop
10
None

我没想到两者之间有任何差异。为什么用 super() 调用 set_prop 方法不会为类的所有实例设置值?

4

1 回答 1

2

当您添加 a print(cls)to时,区别很明显Parent.set_prop

    @classmethod
    def set_prop(cls, value):
        print(cls)
        cls.parent_prop = value

在案例 1 中运行时:

Child1 set parent prop
<class '__main__.Parent'>
10
10

在案例 2 中运行时:

Child1 set parent prop
<class '__main__.Child1'>
10
None

那是因为super没有给你父类,而是一个代理,它将调用父类的方法(使用特殊的__getitem__)但具有相同的参数,这里在第二种情况下相同的值clsChild1但只是Parent在第一种情况下。

于 2022-02-07T14:08:01.440 回答