How to extend an existing python instance
我想把我的大脑包裹在这里…假设我有一个简单的类继承设置:
1 2 3 4 5 6 7
| class SuperClass(object):
def __init__(self):
self.var = 1
class SubClass(SuperClass):
def getVar(self):
return self.var |
如果我有一个现有的SuperClass实例,有没有一种方法可以在不创建新实例的情况下将其"强制"为SubClass?
- 看起来这可能是我要找的…
- 我想这是其中之一…只是因为你不能,并不意味着你应该…一旦你知道你想要什么,我会看看工厂设计模式,稍后再实例化它。
- 你为什么想要?你希望完成什么?为什么getVar不是SuperClass方法?
- @Karlknechtel:这只是一个非常简单的例子,实际上不是我的代码。
- 好吧,是的;关键是,解决问题的正确方法取决于你实际情况的细节——因为这不是你想要用一种通用的暴力方法来解决问题的那种方式。想要做这类事情经常会指向一个设计缺陷。
在python中,您没有cast运算符—您可以通过将类型分配给实例的__class__属性来绕过此问题:
1 2 3 4
| >>> super_instance = SuperClass()
>>> super_instance.__class__ = SubClass
>>> print super_instance.getVar()
1 |
但是,在许多其他语言中,这比cast更容易出错,因为编译器没有验证"cast的有效性和安全性。
例如,如果SubClass有一个方法访问了SuperClass上不可用的属性,那么尝试在super_instance上调用该方法将导致运行时出错,即使它似乎是SubClass的有效实例。
- 我甚至不确定我是否真的想做什么——我试图创建一个状态机来模拟一些硬件。需要多考虑一下…你的回答是正确的,很好。但我同意我应该重新考虑我在做什么。
- 不要使用子类型来指示状态机中的状态;使用对象的内部状态(即属性)。即使你需要不同的行为,你也会发现使用状态/策略模式更容易生活。