zoukankan      html  css  js  c++  java
  • 静态方法与类方法的理解与应用

    Python中3种方式定义类的方法。常规,classmetod,staticmethod

    class A(object):
        def foo(self, x):
            print("executing foo(%s,%s)" % (self, x))
            print('self:', self)
        @classmethod
        def class_foo(cls, x):
            print("executing class_foo(%s,%s)" % (cls, x))
            print('cls:', cls)
        @staticmethod
        def static_foo(x):
            print("executing static_foo(%s)" % x)    
    a = A()

    从定义上讲:

    普通的类方法foo()需要通过self参数隐式的传递当前类对象的实例。

    @classmethod修饰的方法class_foo()需要通过cls参数传递当前类对象。

    @staticmethod修饰的方法定义与普通函数是一样的。

    self和cls的区别不是强制的,只是PEP8中一种编程风格,

    slef通常用作实例方法的第一参数,cls通常用作类方法的第一参数。

    即通常用self来传递当前类对象的实例,cls传递当前类对象。

    从绑定对象来讲:

    foo方法绑定对象A的实例,class_foo方法绑定对象A,static_foo没有参数绑定。

    >>> print(a.foo)

    <bound method A.foo of <__main__.A object at 0x0278B170>>

    >>> print(a.class_foo)

    <bound method A.class_foo of <class '__main__.A'>>

    >>> print(a.static_foo)

    <function A.static_foo at 0x02780390>

    从调用方式:

    foo可以通过实例a调用方法:
    
    >>> a.foo(1)
    
    foo也可以通过类,来调用方法。但是要求传入实参a
    
    A.foo(a, 1)
    class_foo通过类对象或对象实例调用。
    >>> A.class_foo(1)
    executing class_foo(<class '__main__.A'>,1)
    cls: <class '__main__.A'>
    >>> a.class_foo(1)
    executing class_foo(<class '__main__.A'>,1)
    cls: <class '__main__.A'>
    static_foo通过类对象或对象实例调用。
    
    >>> A.static_foo(1)
    executing static_foo(1)
    >>> a.static_foo(1)
    executing static_foo(1)
    classmethod与staticmethod这两者的区别在于,classmethod增加了一个对实际调用类的引用,这带来了很多方便的地方:
    可以判断出自己是通过基类被调用,还是通过某个子类被调用通过子类调用时,
    可以返回子类的实例而非基类的实例通过子类调用时,
    可以调用子类的其他classmethod
  • 相关阅读:
    如何克隆虚拟机
    如何将Linux rm命令删除的文件放入垃圾箱
    centOS如何设置时间同步
    linux环境搭建系列之maven
    Telnet 安装
    pycharm许可证过期
    linux环境搭建系列之svn安装
    linux环境搭建系列之Apache MQ安装
    通过 U 盘安装 VMware ESXi 5.5 的过程及其注意事项
    图文并茂 RAID 技术全解 – RAID0、RAID1、RAID5、RAID100……
  • 原文地址:https://www.cnblogs.com/topass123/p/12835928.html
Copyright © 2011-2022 走看看