gpt4 book ai didi

Python:如何在派生类之间共享类属性?

转载 作者:太空宇宙 更新时间:2023-11-03 11:40:39 24 4
gpt4 key购买 nike

我想在某个类的所有实例及其所有派生类之间共享一些信息。

class Base():
cv = "some value" # information I want to share

def print_cv(self, note):
print("{}: {}".format(note, self.cv))

@classmethod
def modify_cv(cls, new_value):
# do some class-specific stuff
cls.cv = new_value

class Derived(Base):
pass

b = Base()
d = Derived()

b.print_cv("base")
d.print_cv("derived")

输出符合预期(两个类的实例都看到正确的类属性):

base: some value
derived: some value

我可以更改此类属性的值,一切仍然正常:

# Base.cv = "new value"
b.modify_cv("new value")
b.print_cv("base") # -> base: new value
d.print_cv("derived") # -> derived: new value

到目前为止一切顺利。问题是,如果我通过派生类访问 cv,则基类和派生类之间的“连接”可能会中断:

# Derived.cv = "derived-specific value"
d.modify_cv("derived-specific value")
b.print_cv("base") # -> base: new value
d.print_cv("derived") # -> derived: derived-specific value

这种行为是预期的,但这不是我想要的!

我理解为什么 ab 看到 cv 的不同值 - 因为它们是不同类的实例。我已经覆盖派生类中的 cv 值,现在派生类的行为有所不同,我已经多次使用此功能。

但对于我当前的任务,我需要 ab 始终使用相同的 cv!

更新

我已经更新了问题,现在它更好地描述了现实生活中的情况。实际上我并没有像这样修改cv值:

Base.cv = "new value"

修改了一些类方法(实际上所有这些类方法都是在 Base 类中实现的)。

现在解决方案很明显了,我只需要稍微修改一下方法:

class Base():
@classmethod
def modify_cv(cls, new_value):
#cls.cv = new_value
Base.cv = new_value

谢谢大家的讨论和想法(一开始我打算使用getters/setters和模块级属性)

最佳答案

classmethod 在您需要知道哪个类正在调用该方法时很有用,但是如果您想要相同的行为而不管调用该方法的类如何,您可以使用 staticmethod 代替。然后,您可以使用 Base.cv 简单地通过基类的名称访问类变量:

class Base:
cv = "some value" # information I want to share

def print_cv(self, note):
print("{}: {}".format(note, self.cv))

@staticmethod
def modify_cv(new_value):
Base.cv = new_value

您仍然可以在任何实例或子类上调用它,但它始终会更改 Base.cv:

>>> b = Base()
>>> d = Derived()
>>> Base.cv == Derived.cv == b.cv == d.cv == "some value"
True
>>> d.modify_cv("new value")
>>> Base.cv == Derived.cv == b.cv == d.cv == "new value"
True

更新:

如果出于其他原因仍然需要访问该类,请像以前一样使用带有 cls 参数的 classmethod,但仍然通过 访问基类的变量>Base.cv 而不是 cls.cv:

@classmethod
def modify_cv(cls, new_value):
do_stuff_with(cls)
Base.cv = new_value

关于Python:如何在派生类之间共享类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50171634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com