首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python types.MethodType()

Python types.MethodType()
EN

Stack Overflow用户
提问于 2017-12-14 00:15:41
回答 2查看 4.3K关注 0票数 1

为什么我必须将types.MethodType()的结果赋值给一个属性,然后才能通过p.**在下面的示例中使用它。我认为,方法types.MethodType()已经将该方法绑定到实例上。希望有人能帮上忙。非常感谢。

下面是我的代码:

代码语言:javascript
复制
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()

[

][

]

EN

回答 2

Stack Overflow用户

发布于 2017-12-14 05:07:58

下面的代码将一个方法移植到一个类上:

代码语言:javascript
复制
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'

是的,简单的赋值是有效的。

将方法移植到实例上比较困难,但却是可行的:

代码语言:javascript
复制
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的方法。

执行以下操作是为了阐明:

代码语言:javascript
复制
print(my_method)
print(A.grafted)
print(a.instance_patched)
print(a.instance_patched.__func__)  # in python 2.x, .im_func
票数 4
EN

Stack Overflow用户

发布于 2017-12-14 05:10:27

确保在与eat()相同的级别上正确缩进getName()

对于您的情况,不需要types.MethodType()

代码语言:javascript
复制
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()

输出:

代码语言:javascript
复制
Peter is eating Pork bean
My name is Peter

此外:

代码语言:javascript
复制
types.MethodType(getName, p) 

没有做任何有用的事情,因为您丢弃了返回值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47797661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档