如何在python中覆盖类,或取消声明类或重新声明一个类?

时间:2012-03-22 10:12:59

标签: python class

有没有可能覆盖class,或者unclare类或者在python中重新声明一个Class?

2 个答案:

答案 0 :(得分:4)

是的,请再次声明:

class Foo(object): x = 1

class Foo(object): x = 2

上面的代码不会引发任何错误,名称Foo将引用声明的第二个类。但请注意,第一个声明声明的类在任何引用它的情况下仍然存在,例如:实例或派生类。

这意味着当您声明具有相同名称的新类时,现有实例不会更改类,并且现有子类不会从新类中神奇地继承。

处理子类的最简单方法可能是重新声明子类,因此它们继承自“更新的”基类。另一种方法是弄乱他们的__bases__属性,虽然我不能告诉你这是否会产生意想不到的结果(几乎可以肯定会出现一些不起作用的极端情况)。

对于现有实例,可以使用新类重新分配其__class__属性。这确实提出了两个问题 - 首先您必须找到它们(请参阅此问题:Printing all instances of a class),其次,存储在实例__dict____slots__属性中的项目仍将存在那些情况。如果您的新类定义不应该发生这种情况,那么您必须编写适当的代码来处理转换过程中的内容。

总之,除了非常简单的情况外,它不太可能值得。如果您需要完整的正常运行时间,那么最好使用基于复制的方法来实现代码更改。

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

答案 1 :(得分:2)

照常使用del className取消课程。