假设我有一个类,它有许多子类.
我可以实例化这个类.然后我可以将其__class__
属性设置为其中一个子类.我已经在一个活动对象上有效地将类类型更改为其子类的类型.我可以在它上面调用调用这些方法的子类版本的方法.
那么,这样做有多危险?这看起来很奇怪,但做这样的事是不是有wrong美元?尽管可以在运行时更改类型,但这是语言中应该完全避免的特性吗?为什么?
(根据回复,我会发布一个更具体的问题,询问我想做什么,以及是否有更好的 Select ).
假设我有一个类,它有许多子类.
我可以实例化这个类.然后我可以将其__class__
属性设置为其中一个子类.我已经在一个活动对象上有效地将类类型更改为其子类的类型.我可以在它上面调用调用这些方法的子类版本的方法.
那么,这样做有多危险?这看起来很奇怪,但做这样的事是不是有wrong美元?尽管可以在运行时更改类型,但这是语言中应该完全避免的特性吗?为什么?
(根据回复,我会发布一个更具体的问题,询问我想做什么,以及是否有更好的 Select ).
以下是我能想到的使这件事变得危险的事情 list ,从最坏到最坏的顺序大致如下:
__init__
方法,因此可能不会正确初始化所有实例变量(甚至根本不会).__slots__
,则所有类都必须具有相同的插槽.(如果你有兼容但不同的插槽,它一开始可能会工作,但会做一些可怕的事情……) __new__
,事情就不会按照你天真的预期进行.同时,在许多你认为有必要这样做的情况下,有更好的 Select :
__new__
或其他机制来钩住 struct .作为上一种最常见的特殊情况,只需将所有"变量方法"放入类中,这些类的实例作为"父"的数据成员保存,而不是放入子类中.不要改self.__class__ = OtherSubclass
,只要改self.member = OtherSubclass(self)
就行了.如果你真的需要方法来神奇地改变,那么自动转发(例如,通过__getattr__
)是一种比动态改变类更常见、更通俗的习惯用法.