如何在python中重写类、取消声明类或重新声明类?

如何在python中重写类、取消声明类或重新声明类?,python,class,Python,Class,在python中是否有可能重写类、取消声明类或重新声明类?是的,只需再次声明它: class Foo(object): x = 1 class Foo(object): x = 2 上述代码不会引发任何错误,名称Foo将引用声明的第二个类。但是请注意,如果有任何东西引用第一个声明声明的类,例如实例或派生类,则该类仍将存在 这意味着,当您用相同的名称声明一个新类时,现有实例不会更改类,现有子类也不会神奇地从新类继承 处理子类的最简单方法可能是重新声明它们,因此它们继承自“更新的”基类。另一种选

在python中是否有可能重写类、取消声明类或重新声明类?

是的,只需再次声明它:

class Foo(object): x = 1

class Foo(object): x = 2
上述代码不会引发任何错误,名称
Foo
将引用声明的第二个类。但是请注意,如果有任何东西引用第一个声明声明的类,例如实例或派生类,则该类仍将存在

这意味着,当您用相同的名称声明一个新类时,现有实例不会更改类,现有子类也不会神奇地从新类继承

处理子类的最简单方法可能是重新声明它们,因此它们继承自“更新的”基类。另一种选择是弄乱它们的
\uuuuuuu base\uuuuuu
属性,尽管我不能告诉您这是否会产生意外的结果(几乎肯定会有一些极端情况下,这不起作用)

对于现有实例,可以使用新类重新分配它们的
\uuuuu class\uuuu
属性。这确实带来了两个问题—首先,您必须找到它们(请参见此问题:),其次,存储在实例
\uuuuu dict\uuuuuu
\uuu slots\uuuu
属性中的项仍将存在于这些实例中。如果您的新类定义不应该出现这种情况,那么您必须编写适当的代码作为转换的一部分来处理这种情况

总而言之,除非是在非常简单的情况下,否则它不太值得。如果您需要运行系统的完整正常运行时间,那么最好使用基于复制的方法来实现代码更改


更新:如果这是您知道要做的事情,另一个解决方案是使用策略模式。

像往常一样使用
del className
取消声明一个类。

请提供一个代码示例,说明您要做什么。但是第一个类的实例呢?第一类的子类?如何更新它们?取消声明或重新定义的类的实例不受影响。通过重新定义或取消定义,您只会影响类名的全局已知标识符。该类的编译代码仍然存在,直到没有实例再使用它为止。您不能更改现有实例的代码。@对不起,您没有阅读我的答案吗?这些信息从一开始就在我的答案中。@Marcin我刚刚在我上面的评论中回答了agf的问题。@Alfe,我的答案再次包含了这些信息。嘿,Alfe,你的答案没有提到你取消声明或重新定义的类的实例不受影响。通过重新定义或取消定义,您只会影响类名的全局已知标识符。该类的编译代码仍然存在,直到没有实例再使用它为止。无法更改现有实例的代码。