数据库

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

时间:2010-12-5 17:23:32  作者:人工智能   来源:IT科技  查看:  评论:0
内容摘要:@staticmethod 与 @classmethod在Python中称为 装饰器,用来修饰函数,相当于添加一个额外的功能,不再像普通函数那样进行实例化。@staticmethod和@classme

 @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(fi 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) #输出如下 1 my name is Runsen 1 i am 20 years old 1 my name is Runsen 1 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源码下载
copyright © 2025 powered by 益强资讯全景  滇ICP备2023006006号-31sitemap