Python3基础-classmethod 修饰符
1、classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。
class People: china = 'Chin' # 属性默认为类属性(可以给直接被类本身调用 # 实例化方法(必须实例化类之后才能被调用) def func1(self): print('foo') # 类方法(不需要实例化类就可以被类本身调用) @classmethod def clm(cls): # cls : 表示没用被实例化的类本身 print('clm') print(cls.china) cls().func1() # 调用 foo 方法 People.clm() #不需要实例化
执行结果:
clm
Chin
foo
2、利用描述符自定制classMethod
class ClassMethod: def __init__(self,func): self.func = func def __get__(self, instance, owner): val = self.func(owner) return val class People: china = 'Chin' def func1(self): print('foo') @ClassMethod #clm = ClassMethod(clm) def clm(cls): print('clm') print(cls.china) cls().func1() # 调用 foo 方法 People.clm
以上代码执行结果如下
clm
Chin
foo
带多个参数
class ClassMethod: def __init__(self,func): self.func = func def __get__(self, instance, owner): def feedbcak(*args,**kargs): # print(owner) # print(args) # print(kargs) val = self.func(owner,*args,**kargs) return val return feedbcak class People: china = 'Chin' def func1(self): print('foo') @ClassMethod #clm = ClassMethod(clm) def clm(cls,name,age): #print('clm') print(cls.china,name,age) #cls().func1() # 调用 foo 方法 # People.clm() #不需要实例化 People.clm('类的调用',100) p1 = People() p1.clm('实例的调用',100)
以上代码执行结果如下:
Chin 类的调用 100
Chin 实例的调用 100