3 回答
TA贡献1789条经验 获得超10个赞
好的,再次,这不是您通常应该执行的操作,仅用于提供信息。
其中的Python查找一个实例对象的方法是由确定__mro__它定义了对象(该类的属性中号 ethod ř esolution ö刻申属性)。因此,如果我们能够改变__mro__的Person,我们会得到期望的行为。就像是:
setattr(Person, '__mro__', (Person, Friendly, object))
问题是这__mro__是一个只读属性,因此setattr将不起作用。也许如果您是Python专家,那么可以采取一些措施,但显然我没有达到专家地位,因为我想不到。
一个可能的解决方法是简单地重新定义该类:
def modify_Person_to_be_friendly():
# so that we're modifying the global identifier 'Person'
global Person
# now just redefine the class using type(), specifying that the new
# class should inherit from Friendly and have all attributes from
# our old Person class
Person = type('Person', (Friendly,), dict(Person.__dict__))
def main():
modify_Person_to_be_friendly()
p = Person()
p.hello() # works!
这不做的是修改任何先前创建的Person实例以使用该hello()方法。例如(仅修改main()):
def main():
oldperson = Person()
ModifyPersonToBeFriendly()
p = Person()
p.hello()
# works! But:
oldperson.hello()
# does not
如果type调用的细节不清楚,请阅读e-satis关于“ Python中的元类是什么?”的出色答案。。
TA贡献1827条经验 获得超4个赞
我不能保证后果,但是这段代码可以满足您在py2.7.2上的要求。
class Friendly(object):
def hello(self):
print 'Hello'
class Person(object): pass
# we can't change the original classes, so we replace them
class newFriendly: pass
newFriendly.__dict__ = dict(Friendly.__dict__)
Friendly = newFriendly
class newPerson: pass
newPerson.__dict__ = dict(Person.__dict__)
Person = newPerson
p = Person()
Person.__bases__ = (Friendly,)
p.hello() # prints "Hello"
我们知道这是可能的。凉。但是我们永远不会使用它!
添加回答
举报