1>概念性的东西
在类内部定义的函数,分为两大类:
1、绑定方法:绑定给谁,就由谁来调用,谁来调用,谁就是self/cls
绑定到对象的方法:在类内定义的,没有被任何装饰器修饰的函数属性
对象.bound_method(),自动将对象当做第一个参数传入
(类也可以调用,但必须按函数的调取规则来,即self需要手动传参)
绑定到类的方法:在类内定义的,用classmethod装饰器修饰的函数属性
类.bound_method(),自动将类当做第一个参数传入
(对象也可以调用,但仍将类作为第一个参数传入)
2、非绑定方法
不与类或者对象绑定,用staticmethod装饰器修饰的函数属性,类或者对象都可以调用,也就是普通函数,普通函数
就没有自动传值这一说了,该怎么传就怎么传
2>应用
设想一个场景,我先需要简单的查询对象的一些属性信息,定义一个简单的类解决,如下
现在增加需求,有时候还需要从配置文件获取信息,遂,增加一个针对配置文件操作的函数,如下
但是这样写有2个问题:1、调取麻烦,因方法本就是绑定给对象使用,类调用起来还要自己传参;2、类名写死了,obj不管
是哪个类调用,都只能返回People类对象
所以,这时可以介入 @classmethod了,改写如下
综上所述
# 绑定给对象,就应该由对象来调用,自动将对象本身当做一个参数传入
# 绑定给类,就应该由类来调用,自动将类本身当做第一个参数传入