【发布时间】:2012-01-22 14:50:21
【问题描述】:
是否可以在运行时将基类添加到对象实例(不是类!)?类似于 Object#extend 在 Ruby 中的工作方式:
class Gentleman(object):
def introduce_self(self):
return "Hello, my name is %s" % self.name
class Person(object):
def __init__(self, name):
self.name = name
p = Person("John")
# how to implement this method?
extend(p, Gentleman)
p.introduce_self() # => "Hello, my name is John"
【问题讨论】:
-
呜呜呜呜呜呜!!!!!!更改实例而不更改类是灾难的根源。更好的方法是创建
Person的子类并将Gentleman混合到其中。 -
@katrielalex:在大多数情况下你可能是对的。尽管如此,我还是需要该功能,因为我想将功能添加到我无法更改其接口的第三方库。我不得不在 mixins 或代理模式之间做出选择,我不太喜欢后者。