有没有可能在Python中使用已经实例化的超类生成子类?在
我不知道该如何界定这个问题,所以让我举个例子。假设我有一个类矩形,我想构建另一个类coloredlectangle。但我不希望相同维度的每个ColoredRectangle
都是自己的新Rectangle
。所以当我启动ColoredRectangle
时,我会传递一个已经实例化的Rectangle
。在
也就是说,我想要
r = Rectangle([1,2])
r_red = ColoredRectangle(r, "red")
r_blue = ColoredRectangle(r, "blue")
但是现在r_red
和{Rectangle
有一个area()
属性。在
r_red
和r_blue
应该“指向”相同的Rectangle
。我知道我可以这样写:
class ColoredRectangle(Rectangle):
def __init__(self, rectangle, color):
self.color = color
self.rectangle = rectangle
但那我就得写了
r_red.rectangle.area
很难看。在
您似乎要求做的是将属性访问重定向到底层的
Rectangle
对象。__getattr__
方法可以为您做到这一点。在按矩形属性写入所有属性。它们在
__dict__
属性中。在继承
继承在python中是一件很好的事情,我认为您不必求助于
getattr
黑客,如果您想要的话,请向下滚动。在您可以强制类字典引用另一个对象:
这两个将引用相同的
^{pr2}$Rectangle
对象:这是一篇关于元编程的优秀演讲,虽然它的标题意味着Python3,但它的很多内容也适用于python2.x:David Beazley - Python3 Metaprogramming
getattr
黑客攻击但是,如果出于任何原因,您希望多个
^{3}$ColoredRectangle
引用同一个基Rectangle
,那么这些将相互冲突:如果您希望不同的“代理对象”,它们可以从基
Rectangle
中获取属性,但不会相互干扰,那么您可以使用getattr
黑客攻击,这也很有趣:这样可以避免干扰:
关于}:
__getattr__
与{由于只有未找到的属性将由
__getattr__
处理,因此您还可以部分更新代理,这可能会令人困惑:要避免这种情况,可以重写
__setattr__
:相关问题 更多 >
编程相关推荐