是的,只需再次声明即可:
class Foo(object): x = 1
class Foo(object): x = 2
Run Code Online (Sandbox Code Playgroud)
上面的代码不会引发任何错误,并且名称Foo将引用声明的第二个类。但请注意,如果有任何对象(例如实例或派生类)引用第一个声明所声明的类,则该类仍然存在。
这意味着当您声明具有相同名称的新类时,现有实例不会更改类,并且现有子类不会神奇地从新类继承。
处理子类的最简单方法可能就是重新声明它们,以便它们从“更新的”基类继承。另一种选择是弄乱他们的__bases__财产,尽管我不能告诉你这是否会产生意想不到的结果(几乎肯定会有一些极端情况,这是行不通的)。
对于现有实例,可以__class__用新类重新分配其属性。这确实提出了两个问题 - 首先你必须找到它们(请参阅这个问题:打印类的所有实例),其次,存储在实例__dict__或__slots__属性中的项目仍然存在于这些实例中。如果这不是您的新类定义中应该发生的事情,您将必须编写适当的代码来处理它作为转换的一部分。
总之,除非在非常简单的情况下,否则不太值得。如果正在运行的系统需要完整的正常运行时间,那么最好使用基于复制的方法来实现代码更改。
更新:如果这是您知道要做的事情,另一个解决方案是使用策略模式。