当前位置:主页 > 查看内容

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

发布时间:2021-10-09 00:00| 位朋友查看

简介:@staticmethod 与 @classmethod在Python中称为 装饰器,用来修饰函数,相当于添加一个额外的功能,不再像普通函数那样进行实例化。 @staticmethod和@classmethod 其实@staticmethod和@classmethod都是用来声明静态方法的。只不过一个声明静态方法,一个声明……

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

@staticmethod和@classmethod

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

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

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

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

  1. ''
  2. @Author:Runsen 
  3. @微信公众号:Python之王 
  4. @博客:https://blog.csdn.net/weixin_44510615 
  5. @Date:2020/8/30 
  6. ''
  7. class A(): 
  8.     # 类的属性 
  9.     x = 1 
  10.  
  11.     @classmethod 
  12.     def get_name(cls, name): 
  13.         print(cls.x)   
  14.         print('my name is %s' % name
  15.  
  16.     @staticmethod 
  17.     def get_age(age): 
  18.         print(A.x) 
  19.         print(f'i am %s years old' % age) 
  20.  
  21. if __name__ == '__main__'
  22.     A.get_name('Runsen')   
  23.     A.get_age(20) 
  24.      
  25.     # 实例对象同样运行 
  26.     a = A() 
  27.     a.get_name('Runsen'
  28.     a.get_age(20) 
  29.  
  30.      
  31. #输出如下 
  32. my name is Runsen 
  33. i am 20 years old 
  34. my name is Runsen 
  35. i am 20 years old 

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

@property

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

  1. class School(): 
  2.     name = "家里蹲大学" 
  3.  
  4.     def test(self): 
  5.         print("实例方法"
  6.  
  7.     @property 
  8.     def test_pro(self): 
  9.         print("静态属性"
  10.  
  11. if __name__ == "__main__"
  12.     s = School() 
  13.     print(s.name
  14.     s.test() 
  15.      
  16.  # 输出如下    
  17.  家里蹲大学 
  18.  实例方法 

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

  1. class School(): 
  2.     name = "家里蹲大学" 
  3.  
  4.     def test(self): 
  5.         print("实例方法"
  6.  
  7.     @property 
  8.     def test_pro(self): 
  9.         print("静态属性"
  10.  
  11. if __name__ == "__main__"
  12.     s = School() 
  13.     print(s.name
  14.     # 注意返回的函数 千万别加() 
  15.     s.test_pro 
  16.      
  17.  # 输出如下   
  18.  家里蹲大学 
  19.  静态属性 

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

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

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


本文转载自网络,原文链接:https://mp.weixin.qq.com/s/HmRRQ7dhUUXjfElrZmGOwA
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:一文带你玩转设计模式之「责任链」 下一篇:没有了

推荐图文


随机推荐