假设我有以下课程
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
中复制此行为,如果没有,为什么?
写入时:
只要您为类或对象的成员分配了某种东西,而该成员的名字不存在,就会创建它。事实上,成员名称出现在基类中并没有任何改变。它是在类本身中创建的。
阅读时
:然后进行名称解析:首先尝试在类本身中,然后在其基类中找到一个成员。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