pythone中类方法和静态变量的行为

问题描述 投票:1回答:2

假设我有以下课程

class Parent: 
    message = "Hello World"
    @classmethod
    def print_message(cls):
        print(cls.message)
    @classmethod 
    def change_message(cls, new_message):
            cls.message =  new_message

class Child_one(Parent):
    @classmethod 
    def print_messsage(cls):
        print (cls.message)
    @classmethod 
    def change_message(cls, new_message):
        cls.message = new_message

class Child_two(Parent):
    @classmethod
    def print_message(cls):
        print(cls.message)

[我想我的问题是子类的cls指的是什么,因为如果我更改父类中的静态变量message,则正确地改变了两个子类中message的值

Parent.change_message("This is new message")
Child_one.print_message() # This is new message 
Child_two.print_message() # This is new message

这是我的预期行为,cls.message均引用父类的消息。但是这样做

Child_one.change_message("I am child one") 

行为结果,例如

Parent.print_message() # This is new message 
Child_one.print_message() # I am child one 
Child_two.print_message() # This is new message 

因此Child_one的cls.message变量不再指向父类的消息。

[在其他语言中,例如c++c#,静态更改父类或子类的静态变量会导致所有父类和派生类发生变化。是否有办法在python中复制此行为,如果没有,为什么?

python inheritance class-method static-variables
2个回答
0
投票

写入时:

只要您为类或对象的成员分配了某种东西,而该成员的名字不存在,就会创建它。

事实上,成员名称出现在基类中并没有任何改变。它是在类本身中创建的。

阅读时

然后进行名称解析:首先尝试在类本身中,然后在其基类中找到一个成员。

0
投票
Frank-Rene的回答是绝对正确的,并且您可以通过观察类变量的内存地址来看到此行为:

print(Parent.message, Child_one.message) #identical memory addresses Child_one.change_message("something") print(Parent.message, Child_one.message) #now they are different

这是因为Python中的每个类都将其属性保存在dunder字典(

dict)中,如果未重写它们,则它们将引用父类,直到被修改。

对于您的用例,您可能对Python的borg设计模式感兴趣:https://github.com/faif/python-patterns/blob/master/patterns/creational/borg.py
© www.soinside.com 2019 - 2024. All rights reserved.