为什么我必须将types.MethodType()的结果赋值给一个属性,然后才能通过p.**在下面的示例中使用它。我认为,方法types.MethodType()已经将该方法绑定到实例上。希望有人能帮上忙。非常感谢。
下面是我的代码:
import types
class Person(object):
def __init__(self, newName):
self.name = newName
def eat(self, food):
print("%s is eating %s" % (self.name, food))
def getName(self):
print("My name is %s" % self.name)
def main():
p = Person("Peter")
p.eat("Pork bean")
types.MethodType(getName, p) #p.getName = types.MethodType(getName, p)
p.getName()
if __name__ == "__main__":
main()[

][

]
发布于 2017-12-14 05:07:58
下面的代码将一个方法移植到一个类上:
class A(object):
def __init__(self, value):
self.value = value
def my_method(self): # `self` is a plain name, not a reserved word or something.
return 'Value via a grafted method is %s' % self.value
A.grafted = my_method
assert A('here').grafted() == 'Value via a grafted method is here'是的,简单的赋值是有效的。
将方法移植到实例上比较困难,但却是可行的:
a = A('okay')
a.instance_patched = types.MethodType(my_method, a)
assert a.instance_patched() == 'Value via a grafted method is okay'这里,types.MethodType(my_method, a)创建了一个绑定到a的方法。
执行以下操作是为了阐明:
print(my_method)
print(A.grafted)
print(a.instance_patched)
print(a.instance_patched.__func__) # in python 2.x, .im_func发布于 2017-12-14 05:10:27
确保在与eat()相同的级别上正确缩进getName()。
对于您的情况,不需要types.MethodType():
class Person(object):
def __init__(self, newName):
self.name = newName
def eat(self, food):
print("%s is eating %s" % (self.name, food))
def getName(self):
print("My name is %s" % self.name)
def main():
p = Person("Peter")
p.eat("Pork bean")
p.getName()
if __name__ == "__main__":
main()输出:
Peter is eating Pork bean
My name is Peter此外:
types.MethodType(getName, p) 没有做任何有用的事情,因为您丢弃了返回值。
https://stackoverflow.com/questions/47797661
复制相似问题