假设我有一个类,其中包含许多子类。
我可以实例化该类。然后,我可以将其__class__属性设置为子类之一。我已经在活动对象上有效地将类类型更改为其子类的类型。我可以在其上调用调用这些方法的子类版本的方法。
__class__
那么,这样做有多危险?看起来很奇怪,但是这样做是 错误 的吗?尽管可以在运行时更改类型,但这是否应该完全避免该语言的功能?为什么或者为什么不?
(根据回复,我将针对我想做什么以及是否有更好的选择发布一个更具体的问题)。
这是我能想到的导致危险的列表,从最坏到最坏的顺序排列:
__init__
__slots__
__new__
同时,在许多您认为有必要的情况下,还有更好的选择:
作为最后一个最常见的特定情况,只需将所有“变量方法”放入其实例作为“父”数据成员保存的类中,而不是子类中即可。不要改变self.__class__ = OtherSubclass,而要做self.member = OtherSubclass(self)。如果您确实需要进行神奇更改的方法,那么自动转发(例如via __getattr__)比动态更改类更为常见和Python化。
self.__class__ = OtherSubclass
self.member = OtherSubclass(self)
__getattr__