1.classmethod
@classmethod # 把一个对象绑定的方法 修改成一个 类方法
第一,在方法中仍然可以引用类中的静态变量
第二,可以不用实例化对象,就直接用类名在外部调用这个方法
什么时候用@classmethod?
1.定义了一个方法,默认传self,但这个self没被使用
2.并且你在这个方法里用到了当前的类名,或者你准备使用这个类的内存空间中的名字的时候
import time class Date: def __init__(self,year,month,day): self.year = year self.month = month self.day = day @classmethod def today(cls): struct_t = time.localtime() date = cls(struct_t.tm_year,struct_t.tm_mon,struct_t.tm_mday) return date date对象 = Date.today() print(date对象.year) print(date对象.month) print(date对象.day)
2. @staticmethod 被装饰的方法会成为一个静态方法
class User: pass @staticmethod def login(a,b): # 本身是一个普通的函数,被挪到类的内部执行,那么直接给这个函数添加@staticmethod装饰器就可以了 print('登录的逻辑',a,b) # 在函数的内部既不会用到self变量,也不会用到cls类 obj = User() User.login(1,2) obj.login(3,4)
class A: country = '中国' def func(self): print(self.__dict__) @classmethod def clas_func(cls): print(cls) @staticmethod def stat_func(): print('普通函数') @property def name(self): return 'wahaha'
小结:
能定义到类中的内容
- 静态变量 是个所有的对象共享的变量 有对象类调用 但是不能重新赋值
- 绑定方法 是个自带self参数的函数 由对象调用
- 类方法 是个自带cls参数的函数 由对象类调用
- 静态方法 是个啥都不带的普通函数 由对象类调用
- property属性 是个伪装成属性的方法 由对象调用 但不加括号
@staticmethod 不需要访问和类相关的属性或数据
@classmethod 可以访问和类相关(不和实例相关)的属性
如果你定义了一个方法它的返回值永远和类的属性及实例无关,结果永远不变,就用@staticmethod
如果你定义了一个方法它的返回值和只和类的属性有关,结果可变.就用@classmethod