在类内部定义的函数,分为两大类:
一、绑定方法:绑定给谁,就应该由谁来调用,谁来调用就会把调用者当作第一个参数自动传入
a、绑定到对象的方法:在类内部定义的没有内任何装饰器修饰的
b、绑定到类的方法:在类内部定义的被装饰器classmethod修饰的
二、非绑定方法:没有自动传值,就是类中定义的一个普通工具,对象和类都可以使用 (被装饰器staticmethod修饰)
非绑定方法:不与类或者对象绑定(类和对象都可用)。
class Foo: def __init__(self,name): self.name = name def tell(self): # 类内部定义的函数是绑定给对象使用的 print("名字是%s" %self.name) @classmethod def func(cls): # cls = Foo print(cls) @staticmethod def func1(x,y): print(x+y) f = Foo("alex") # # print(Foo.tell) # # Foo.tell(f) # # print(f.tell) # 绑定方法的特殊之处是绑定给谁就由谁来调用,自动传入第一个参数 # # print(Foo.func) # Foo.func() # print(Foo) print(Foo.func1) print(f.func1) Foo.func1(1,2) f.func1(1,3)
使用场景
import settings,hashlib,time class People: def __init__(self,name,age,sex): self.id = self.create_id() self.name = name self.age = age self.sex = sex def tell_info(self): # 绑定到对象的方法 print("Name:%s,Age:%s,Sex:%s"%(self.name,self.age,self.sex)) @classmethod def from_conf(cls): obj = cls( settings.name, settings.age, settings.sex ) return obj @staticmethod def create_id(): m = hashlib.md5(str(time.time()).encode("utf-8")) return m.hexdigest() # p = People("alex",18,"male") # # 绑定给对象,就应该由对象来调用,自动将对象本身当作第一个参数传入 # p.tell_info() #tell_info(p) # # 绑定给类,就应该由类来调用,自动将类本身当作第一个参数传入 # p = People.from_conf() # from_conf(People) # p.tell_info() # 非绑定方法,不与类或对象绑定,谁都可以调用,没有自动传值一说 p1 = People("alex1",18,"male") p2 = People("alex2",28,"male") p3 = People("alex3",38,"male") print(p1.id) print(p2.id) print(p3.id)