【发布时间】:2017-06-26 09:30:36
【问题描述】:
在我的项目中,我生成了一个类型为 CubicObject 的对象 obj。在运行时,应允许 GUI 设置将 obj 的类型更改为 Tofu 或 Box(并返回),具体取决于用户想要做什么以及他认为对象最能代表什么经过。然后用户应该从相应类中实现的特定算法中受益。我正在寻找这种行为的一个很好的实现。我玩过下面的代码,它改变了__class__ 属性,但我确信这是不好的风格。
class CubicObject(object):
name = 'Baseclass'
def __init__(self, sidelength):
self.sidelength = sidelength
class Tofu(CubicObject):
name = 'Class A'
def eat(self):
print("I've eaten a volume of %s. " % (self.sidelength**3))
class Box(CubicObject):
name = 'Class B'
def paint(self):
print("I painted a surface of %s. " % (self.sidelength**2 * 6))
# user only knows the object is vaguely cubic
obj = CubicObject(sidelength=1.0)
# user thinks the object is a Box
obj.__class__ = Box
obj.paint()
# user changes mind and thinks its a piece of Tofu
obj.__class__ = Tofu
obj.eat()
obj.paint() # generates an error as it should, since we cannot paint Tofu
我的两个问题是:
- 类
A的哪些属性被转移到对象'obj' 当我更改其__class__属性时?调用什么函数
以及更新了哪些属性,或者 obj 是如何发生的 将其名称更改为 A? - 还有哪些更简洁的方法可以实现我想要的行为?如果
必要时,我可以销毁对象
obj并重新创建另一个对象, 但在这种情况下,我想以一种通用的方式这样做(比如obj = RoundObject(subclasstype='Tofu')因为其他部分 代码)。
根本问题是我允许用户在CubicObject 的子类中实现自己的功能,并且应该能够在程序运行时在这些子类之间切换。
【问题讨论】:
-
这看起来像是一个巨大的 XY 问题。你到底想做什么需要这个功能?
-
因为我很确定我能想出十几个例子来说明为什么这是不可能的。
-
我认为这是你在 Java 或 C++ 中要做的事情,其中有类型转换。
-
类型转换不会改变对象的类型。它只是将其视为不同的类型。
-
也许他真正想要的是一个包装类,它可以在运行期间接收不同的内部委托对象。那会更有意义。
标签: python class object dynamic-programming metaclass