【问题标题】:What is the Difference Between a Bound Method and a Function?绑定方法和函数有什么区别?
【发布时间】:2020-08-18 11:13:33
【问题描述】:

考虑以下类:

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

我得到以下输出:&lt;function Employee.fullname at 0x7ff7883c9268&gt;

为什么同一个函数/方法有两种不同的定义?我仍在访问内存中相同的方法/函数对象,对吧?

【问题讨论】:

    标签: python function class object methods


    【解决方案1】:

    当您通过实例em1.fullname 访问fullname 时,您将获得一个绑定方法,这意味着fullname 的一个版本会自动将em1 作为其第一个参数。 p>

    因此您可以调用em1.fullname() 而无需传递任何显式参数。但是如果你调用Employee.fullname(),你会因为缺少参数self而得到一个错误。

    即使方法调用与属性访问分开也适用:

    bound = em1.fullname
    unbound = Employee.fullname
    
    bound()       # OK, first argument is em1
    unbound()     # Error, no argument for self
    unbound(em1)  # OK, first argument supplied
    

    【讨论】:

    • 那么em1.fullnameem1.fullname()有什么区别呢?
    • em1.fullname 是对绑定方法的引用。 em1.fullname() 正在调用绑定的方法。
    • 所以em1.fullname 就像一个“潜在”功能?它具有计算返回值所需的所有参数,但不要求调用它。另外,因为它有它需要的参数,它与没有它需要的参数的函数有根本的不同?
    • em1.fullname 实际上是一个不需要参数的函数。 em1.fullname() 是对该函数的调用,它会触发对Employee.fullname(em1) 的调用。
    【解决方案2】:

    我仍在访问内存中相同的方法/函数对象,对吧?

    绝对不是,这在您提供的输出中很明显。第一个住在0x7ff7883acc88,第二个住在0x7ff7883c9268

    第一个属于一个实例,而第二个属于Employee类本身。

    【讨论】:

      【解决方案3】:

      您可以访问相同的功能。

      但是,为了调用该函数,您只需要使用em1.fullname

      em1.fullname()
      

      但是对于Employee.fullname,您需要提供self 参数并且您需要:

      Employee.fullname(em1)
      

      【讨论】:

        猜你喜欢
        • 2016-05-12
        • 2010-09-14
        • 2016-02-03
        • 1970-01-01
        • 2013-05-23
        • 2012-12-02
        • 1970-01-01
        • 2017-05-16
        相关资源
        最近更新 更多