多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## 概念概述 在类内部定义的函数,分为两大类: 1. 绑定方法: 绑定给谁,就应该由谁来调用,谁来调用就回把调用者当作第一个参数自动传入 * 绑定到对象的方法: 在类内定义的,**没有被任何装饰器修饰的方法** * 绑定到类的方法: 在类内定义的,**被装饰器classmethod修饰的方法** 2. 非绑定方法: 在类内定义的,**被staticmethod装饰器装饰的方法** 不与类或者对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已 >注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说 ## 案例详述 ### 1.主代码 先在以下函数中同事定义了三种绑定方法,代码如下 ~~~ class Foo: def __init__(self,name1): self.name=name1 def tell(self): print('对象绑定方法:%s' %self.name) @classmethod def func(cls,name2): #cls=Foo print('类绑定方法:%s' %name2) @staticmethod def func1(x,y): print('非绑定方法:%s'%(x+y)) f=Foo('egon') ~~~ ### 2.绑定到对象的方法验证 绑定给对象,就应该由对象来调用,自动将对象本身当作第一个参数传入 ``` print(Foo.tell) print(f.tell) Foo.tell(f) f.tell() # 结果 <function Foo.tell at 0x000001819E04C950> <bound method Foo.tell of <__main__.Foo object at 0x000001819E04A860>> 对象绑定方法:egon 对象绑定方法:egon ``` **结论:** Foo.tell是普通函数,直接调用的话需要传入对象才行 f.tell是绑定到对象的方法,可以直接使用,会自动传值 ### 3.绑定到类的方法验证 绑定给类,就应该由类来调用,自动将类本身当作第一个参数传入 ``` print(Foo.func) print(f.func) Foo.func('noah') f.func('luogang') #结果 <bound method Foo.func of <class '__main__.Foo'>> <bound method Foo.func of <class '__main__.Foo'>> 类绑定方法:noah 类绑定方法:luogang ``` **结论:** Foo.func和f.func都是绑定到类的方法,会自动传值 ### 4.非绑定方法验证 非绑定方法,不与类或者对象绑定,谁都可以调用,没有自动传值一说 ``` print(Foo.func1) print(f.func1) Foo.func1(1,2) f.func1(1,2) 结果 <function Foo.func1 at 0x000001A0B669CA60> <function Foo.func1 at 0x000001A0B669CA60> 非绑定方法:3 非绑定方法:3 ``` **结论:** Foo.func1和f.func1都是非绑定方法,不会自己传值,需要自己传值