@Staticmethod、@Classmethod和@Property类装饰器

时间:2022-04-19 03:35:00

@Staticmethod、@Classmethod和@Property类装饰器

@staticmethod 与 @classmethod在Python中称为 装饰器,用来修饰函数,相当于添加一个额外的功能,不再像普通函数那样进行实例化。

@staticmethod和@classmethod

其实@staticmethod和@classmethod都是用来声明静态方法的。只不过一个声明静态方法,一个声明类方法。

静态方法:使用装饰器@staticmethod。没有self和cls参数。

类方法:使用装饰器@classmethod。第一个参数为当前类的对象,通常为cls。

为了方便大家了解两者的差别,以下的示例代码将有助于发现其中的差别:

''

@Author:Runsen 

@微信公众号:Python之王 

@博客:https://blog.csdn.net/weixin_44510615 

@Date:2020/8/30 

''

class A(): 

    # 类的属性 

    x = 1 

 

    @classmethod 

    def get_name(cls, name): 

        print(cls.x)   

        print('my name is %s' % name

 

    @staticmethod 

    def get_age(age): 

        print(A.x) 

        print(f'i am %s years old' % age) 

 

if __name__ == '__main__'

    A.get_name('Runsen')   

    A.get_age(20) 

     

    # 实例对象同样运行 

    a = A() 

    a.get_name('Runsen'

    a.get_age(20) 

 

     

#输出如下 

my name is Runsen 

i am 20 years old 

my name is Runsen 

i am 20 years old 

如果在 @staticmethod 中要调用到这个类的一些属性方法,只能直接 类名.属性名或 类名.方法名。而 @classmethod 因为持有cls参数,可以通过cls来调用类的属性,类的方法,实例化对象等,避免硬编码。

@property

@property可以将一个方法的调用变成属性调用。举例说明:平时我们调用数据属性和方法,是这样的

class School(): 

    name = "家里蹲大学" 

 

    def test(self): 

        print("实例方法"

 

    @property 

    def test_pro(self): 

        print("静态属性"

 

if __name__ == "__main__"

    s = School() 

    print(s.name

    s.test() 

     

 # 输出如下    

 家里蹲大学 

 实例方法 

这时就要用到@preperty装饰器,该装饰器能够让一个方法变成属性调用。

class School(): 

    name = "家里蹲大学" 

 

    def test(self): 

        print("实例方法"

 

    @property 

    def test_pro(self): 

        print("静态属性"

 

if __name__ == "__main__"

    s = School() 

    print(s.name

    # 注意返回的函数 千万别加() 

    s.test_pro 

     

 # 输出如下   

 家里蹲大学 

 静态属性 

从今天以后,在Python编程中,@property广泛应用在Python类的定义中非常常见。你一看到@property,第一反应就是:@property专门负责把一个方法变成同名属性的。

本文已收录 GitHub,传送门~[1] ,里面更有大厂面试完整考点,欢迎 Star。

Reference
[1]传送门~:
https://github.com/MaoliRUNsen/runsenlearnpy100