classmethod与staticmethod

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

 

posted @ 2020-03-11 13:39  Dylan123  阅读(115)  评论(0编辑  收藏  举报