• python3 静态方法@staticmethod和类方法 @classmethod的用法


    一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。
    而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
    这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

    class A(object):
        def m1(self, n):
            print("self:", self)
    
        @classmethod
        def m2(cls, n):
            print("cls:", cls)
    
        @staticmethod
        def m3(n):
            pass
    
    a = A()
    a.m1(1) # self: <__main__.A object at 0x000001E596E41A90>
    A.m2(1) # cls: <class '__main__.A'>
    A.m3(1)

    在类中一共定义了3个方法。

    m1 是实例方法,第一个参数必须是 self(约定俗成的)。

    m2 是类方法,第一个参数必须是cls(同样是约定俗成)。

    m3 是静态方法,参数根据业务需求定,可有可无。当程序运行时,大概发生了这么几件事(结合下面的图来看)。

    第一步:代码从第一行开始执行 class 命令,此时会创建一个类 A 对象(没错,类也是对象,一切皆对象嘛)同时初始化类里面的属性和方法,记住,此刻实例对象还没创建出来。

    第二、三步:接着执行 a=A(),系统自动调用类的构造器,构造出实例对象 a

    第四步:接着调用 a.m1(1) ,m1 是实例方法,内部会自动把实例对象传递给 self 参数进行绑定,也就是说, self 和 a 指向的都是同一个实例对象。

    第五步:调用A.m2(1)时,python内部隐式地把类对象传递给 cls 参数,cls 和 A 都指向类对象。

    class A(object):  
        bar = 1  
        def foo(self):  
            print 'foo'  
    
        @staticmethod  
        def static_foo():  
            print 'static_foo'  
            print A.bar  
    
        @classmethod  
        def class_foo(cls):  
            print 'class_foo'  
            print cls.bar  
            cls().foo()  
    ###执行  
    A.static_foo()  
    A.class_foo()  

    输出

    static_foo
    1
    class_foo
    1
    foo
  • 相关阅读:
    ubuntu下使用ppa安装codeblocks集成开发环境
    CentOS g++ 安装
    CentOS 7.1云服务器 配置FTP服务器vsftpd
    div高度自适应浏览器高度
    HTML中的head结构
    javascript高级进阶系列
    javascript集中跨域方法
    canvas标签的width和height以及style.width和style.height的区别
    html5学习笔记之入新特性
    ie下a标签里的图片会有边框
  • 原文地址:https://www.cnblogs.com/z3286586/p/15137144.html
Copyright © 2020-2023  润新知