面向对象之绑定方法与非绑定方法
一.类中定义的函数分成两大类
一.绑定方法(绑定给谁,谁来调用,就自动将他本身作为第一个参数传入)
1. 绑定到类的方法:用classmethod装饰器装饰的方法。 为类量身定制 类.boud_method(),自动将类当作第一个参数传入 (其实对象也可调用,但仍将类当作第一个参数传入) 2. 绑定到对象的方法:没有被任何装饰器装饰的方法。 为对象量身定制 对象.boud_method(),自动将对象当作第一个参数传入 (属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)
二.非绑定方法:用staticmethod装饰器装饰的方法
1. 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已
注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,
而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说。
二.绑定方法
在类内部定义的函数,默认就是给对象来用,而且是绑定给对象用的,称为对象的绑定方法
绑定给对象的方法
绑定对象的方法特殊之处:应该由对象来调用,对象来调用,会自动将对象当作第一个参数传入
绑定给类的方法
绑定到类的方法特殊之处:应该由类来调用,类来调用,会自动将类当作第一个参数传入
NAME='lxx' AGE=30
import settings class People: def __init__(self,name,age): self.name=name self.age=age def tell(self): print('%s:%s' %(self.name,self.age)) @classmethod def from_conf(cls): return cls(settings.NAME,settings.AGE) # p=People('egon',19) # p.tell() # p1=People(settings.NAME,settings.AGE) # p1.tell() # p2=People(settings.Name,settings.AGE) # p3=People('alex',74) # p3.tell() # print(People.from_conf) # p4=People.from_conf(People) print(People.from_conf)#<bound method People.from_conf of <class '__main__.People'>> p4=People.from_conf() p4.tell()
三.非绑定方法
非绑定方法就是一个普通函数
在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数。staticmethod不与类或者对象绑定,谁都可以调用没有自动传值的效果
特性:既不跟类绑定,也不跟对象绑定,这意味着谁都能用,谁来用都是一个普通函数,也就是说没有自动传值的特性了
import settings import hashlib import time class People: def __init__(self,name,age): self.uid=self.create_id() self.name=name self.age=age def tell(self): print('%s: %s:%s' %(self.uid,self.name,self.age)) @staticmethod#不跟任何人绑定 def create_id(): m=hashlib.md5() m.update(str(time.clock()).encode('utf-8')) return m.hexdigest() obj=People('egon',18) # print(obj.uid,obj.name,obj.age) # obj.tell() # print(obj.create_id) # print(People.create_id) print(obj.create_id())#对象来用普通函数 print(People.create_id())#类来用普通函数