我正在编写一个具有多个构造函数的类,使用@classmethod
. 现在我希望__init__
构造函数和类方法构造函数都调用类的一些例程来设置初始值,然后再执行其他操作。
__init__
这通常是用 self 完成的:
def __init__(self, name="", revision=None):
self._init_attributes()
def _init_attributes(self):
self.test = "hello"
从类方法构造函数中,我会改为调用另一个类方法,因为在self
我将类方法留给return cls(...)
. 现在,我可以将我的_init_attributes()
方法称为
@classmethod
def from_file(cls, filename=None)
cls._init_attributes()
# do other stuff like reading from file
return cls()
这实际上有效(从某种意义上说,我没有收到错误,并且在执行后我实际上可以看到 test 属性c = Class.from_file()
。但是,如果我理解正确,那么这将在类级别上设置属性,而不是在实例上因此,如果我用一个可变对象(例如一个列表)初始化一个属性,那么这个类的所有实例都将使用同一个列表,而不是它们自己的实例列表。这是正确的吗?如果是这样,有没有办法在类方法中初始化“实例”属性,还是我必须以所有属性初始化都在init中完成的方式编写代码?
嗯。实际上,在写这篇文章时:我什至可能遇到比我想象的更大的麻烦,因为从类方法返回时会调用init ,不是吗?那么处理这种情况的正确方法是什么?
注意:文章 [ 1 ] 讨论了一个类似的问题。