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

 


posted @ 2019-11-28 17:53  槑槑DE  阅读(420)  评论(0编辑  收藏  举报