面向对象(四)--绑定方法与非绑定方法(classmethod、staticmethod装饰器)
一、绑定方法与非绑定方法
1、绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):
(1)绑定给对象的方法:在类内部定义的函数(没有被任何装饰器修饰的)默认就是绑定给对象用的。
(2)绑定给类的方法:在类内部定义的函数如果被装饰器@classmethod修饰,则是绑定给类的,应该由类来调用,
调用时将类作为第一个参数自动传入。
绑定方法的精髓在于=========自动传值。
class Foo: def f1(self): # 绑定给对象的方法 print('对象') @classmethod # 绑定给类的方法 def f2(cls): print('绑定给类') obj=Foo() # 绑定给对象的方法,自动传入对象 obj.f1() # 绑定给类的方法,自动传值类 Foo.f2()
2、非绑定方法:类中定义的函数如果被@staticmethod装饰,那么该函数就变成非绑定方式,既不与类绑定,也不与对象绑定,意味着类与对象都可以调用,但只是作为一个普通函数,不会有自动传值的效果。
import settings class MySql: def __init__(self,ip,port): self.ip=ip self.port=port self.id=id def tell_info(self): print('**id:%s ip:%s port:%s**' %(self.id,self.ip,self.port)) @classmethod def from_conf(cls ): return cls(settings.IP,settings.PORT) @staticmethod def creat_id(): import uuid return uuid.uuid4() # obj1=MySql('127.0.0.1',3306) # obj1.tell_info() # obj2=MySql(settings.IP,settings.PORT) obj2=MySql.from_conf() obj2.tell_info()
3、注意点
非绑定方法与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说