zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    jTopo——js库
    node.js
    php 入门笔记
    D3 入门笔记
    webpack笔记
    React.js
    Grunt等前端自动化构建工具
    vue3.0的新特性
    electron-builder 打包流程
    vue里面如何下载图片,如何下载文件
  • 原文地址:https://www.cnblogs.com/dylan123/p/12461927.html
Copyright © 2011-2022 走看看