有没有可能覆盖class,或者unclare类或者在python中重新声明一个Class?
答案 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
取消课程。