python中的绑定方法与非绑定方法

  1.对象的绑定方法

从上图可以看到,同样的talk(),

当实例对象调用该方法的时候,该方法是绑定到调用对象的方法。(实例对象在调用绑定到对象的方法的时候,会将实例对象传递给绑定方法的第一个参数)

当类调用的时候,talk()就是类People中的一个函数(非绑定方法,与下面第3部分分析的用@staticmethod修饰的静态方法类型一样,都是属于类中的函数,即非绑定方法)。(类中的函数,有几个参数传递几个参数)。

如上,当类People调用函数talk()时,没传递参数,发生异常。实例对象p调用方法talk()时,虽然也没有传递参数,但是会自动将实例对象作为实参传递给

talk(self)方法的第一个形参self。

注意:绑定方法都有自动传参的功能。

不是绑定的方法,例如类中的函数,静态方法都是需要有几个参数传递几个参数的。

2.类的绑定方法

在python中,使用@classmethod方法,将类中的方法绑定到类身上。下面看看代码:

In [99]: class People:
    ...:     clsname="clsname" ...: def __init__(self,name): ...: self.name = name ...: ...: @classmethod ...: def talk(cls): ...: print(cls.clsname) ...: pass ...: ...: p = People('xiaohua') ...: print(People.talk()) ...: print(People.talk) ...: print(p.talk()) ...: print(p.talk) ...:

运行结果 clsname None <bound method type.talk of <class '__main__.People'>> clsname None <bound method type.talk of <class '__main__.People'>>

运行结果如下:

使用@classmethod声明是类方法之后,方法就是一个绑定到类上的类方法,可以只用 类名. 调用,也可以使用 实例名. 调用。
使用,这两种方法调用时,都会自动将 类对象 传递到方法的第一形参上。

3.非绑定方法


由上图可以看到,无论是使用 类名. 调用,还是使用 实例名. 调用静态方法,都是需要有几个形参,就传递几个实参的。

总结
1.非绑定方法:用@staticmethod修饰的静态方法(如第三部分所介绍的)、类中的函数(如第一部分所介绍的,通过 类名. 调用的没有被任何修饰器修饰的函数)
2.绑定方法:分为绑定到对象上的方法和绑定到类上的方法。
(1)绑定到对象上的方法:类中的方法,通过 对象名. 调用的方法(如第一部分所介绍的)
(2)绑定到类上的方法:用@classmethod修饰器修饰的方法(如第二部分所介绍的)


如有错误,欢迎大家指出。

猜你喜欢

转载自www.cnblogs.com/Allen-win/p/8998382.html