天天看点

79_类方法83.类方法静态方法区别

83.类方法

staticmethod 官方文档

classmethod 官方文档

类方法是从属于

“类对象”的方法

。类方法通过装饰器

@classmethod

来定义,格式如下:

@classmethod 
def 类方法名(cls [,形参列表]) : 
    函数体
    # 可以理解为 无需实例化对象。就可以直接通过 类名.方法名() 来访问的方法 
           

要点如下:

  1. @classmethod

    必须位于方法上面一行
  2. 第一个

    cls

    必须有;

    cls

    指的就是

    “类对象”

    本身;(和

    self

    指的是

    实例对象

    本身有异曲同工之处)
  3. 调用类方法格式

    :“类名.类方法名(参数列表)”

    。 参数列表中,不需要也不能给

    cls

    传 值。
  4. 类方法中

    访问实例属性

    实例方法

    会导致

    错误

  5. 子类继承父类方法

    时,传入

    cls

    是子类对象,而

    非父类对象

    【操作】类方法使用测试
# 类方法   从属于   类(模具)的  方法

class Student02:
    company = '海贼王'  # 类属性
    @classmethod  # 建立 实例对象之后  类(模具) 方法不会建立在 实例对象里面
    def printCompany(cls):
        print(cls.company)
        
Student02.printCompany()
           

静态方法

Python中允许定义与“类对象”无关的方法,称为“静态方法”。

静态方法”和在模块中定义普通函数没有区别,只不过“静态方法”放到了“类的名字空 间里面”,需要通过“类调用”。

静态方法通过装饰器

@staticmethod

来定义,

格式如下:

@staticmethod 
def 静态方法名([形参列表]) : 
    函数体 
           

要点如下:

  1. @staticmethod

    必须位于方法上面一行
  2. 调用静态方法格式:“类名.静态方法名(参数列表)”。
  3. 静态方法中

    访问实例属性

    实例方法

    导致错误

【操作】静态方法使用测试

class Student03:
    company = '海贼王'  # 类属性

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @staticmethod
    def add(a, b):  # 静态方法
        print(Student03.company)  # 静态方法  里面 也可以调用  类属性
        print('{0}+{1}={2}'.format(a, b, (a + b)))
        return a + b   # 类方法 和 静态方法中,不能调用 实例变量和实例方法
        # 模具里 想吃饼干(实例对象和方法),不可以, 也就是 无法传递 self


Student03.add(20, 30)

           

区别

这两个方法的用法是类似的,在上面的例子中大多数情况下,

classmethod

也可以通过

staticmethod

代替,在通过类调用时,这两者对于调用者来说是不可区分的。

这两者的区别在于,

classmethod

增加了一个对

实际调用类

引用

,这带来了很多方便的地方:
  • 方法可以判断出自己是通过基类被调用,还是通过某个子类被调用
  • 通过子类调用时,方法可以返回子类的实例而非基类的实例
  • 通过子类调用时,方法可以调用子类的其他

    classmethod

  • 一般来说

    classmethod

    可以完全替代

    staticmethod

staticmethod

唯一的好处是调用时它返回的是一个

真正的函数

,而且每次调用时

返回同一个实例

classmethod

则会对

基类

子类

返回不同的

bound method

实例),但这点几乎从来没有什么时候是有用的。

不过,

staticmethod

可以在子类上被

重写为classmethod

,反之亦然 。

继续阅读