如何解决绑定方法和函数有什么区别?
请考虑以下课程:
class Employee:
def __init__(self,first,last,pay):
self.first=first;self.last=last
self.pay=pay
self.email=first.lower()+'.'+last.lower()+"@company.com"
def fullname(self): return "{} {}".format(self.first,self.last)
如果我这样访问全名方法:
em1.fullname #assume em1 object already exists
我得到以下输出:
<bound method Employee.fullname of <__main__.Employee object at 0x7ff7883acc88>>`
但是,如果我这样访问全名方法:
Employee.fullname
我得到以下输出:<function Employee.fullname at 0x7ff7883c9268>
为什么相同的函数/方法有两个不同的定义?我仍在访问内存中的相同方法/函数对象,对吧?
解决方法
通过实例fullname
访问em1.fullname
时,您将获得绑定方法,这意味着fullname
的版本会自动获取{{1} }作为第一个参数。
因此,您可以调用em1
,而不必传递任何显式参数。但是,如果您致电em1.fullname()
,则会由于缺少参数Employee.fullname()
而收到错误消息。
即使方法调用与属性访问分开时,这也适用:
self
,
我仍在访问内存中的相同方法/函数对象,对吧?
绝大部分不是,这在您提供的输出中很明显。第一个位于0x7ff7883acc88
,第二个位于0x7ff7883c9268
。
第一个属于实例,而第二个属于Employee
类本身。
您可以访问相同的功能。
但是,要使用em1.fullname
调用函数,您只需要:
em1.fullname()
但是对于Employee.fullname
,您需要提供self
参数,并且需要:
Employee.fullname(em1)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。