Python实例方法、类方法和静态方法举例理解

一次性理解实例方法、静态方法和类方法。

今天的对象:

  • @classmethod 类方法;
  • @staticmethod 静态方法;
  • 普通实例方法;

1. 基本类

先写从普通的一个类写起:


class Fruit(object):

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

apple = Fruit('apple')

这个时候,我们称Fruitclass(类)appleinstance(实例)


2. 实例方法

接下来再添加一个值price和方法show_price


class Fruit(object):

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

    def show_price(self):
        print(f'The price is {self.price}')

apple = Fruit('apple', 7.0)
apple.show_price()

这个时候,apple.show_price就是apple这个实例的instance method(实例方法)
直接用 Fruit.show_price() 调用会出错,从两个概念上说:

  • instance method是实例方法,只能由实例调用,不能由调用。show_price(self)的第一个参数是实例
  • 水果没有价格的概念,苹果才有。

3. 类方法

继续添加一个方法eat()


class Fruit(object):

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

    def show_price(self):
        print(f'The price is {self.price}')

    @classmethod
    def eat(cls):
        print("Enjoy.")

apple = Fruit('apple', 7.0)
apple.show_price()
Fruit.eat()
apple.eat()

同样,我们从两个纬度理解:

  • eat(cls)的参数是 cls,即类是它的参数,因此可以从类直接调用。实例也是类,因此实例也可以调用。类方法主要用于一些不需要实例化类就能调用的方法。
  • 绝大部分水果具有可以食用的属性,因此说吃水果吃苹果在逻辑上都成立。

4. 静态方法

这次我们添加一个静态方法 will_go_bad() 和一个外部的静态变量 BAD_WEATHER


BAD_WEATHER = True

class Fruit(object):

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

    def show_price(self):
        print(f'The price is {self.price}')

    @classmethod
    def eat(cls):
        print("Enjoy.")

    @staticmethod
    def will_go_bad():
        if BAD_WEATHER:
            return True

apple = Fruit('apple', 7.0)
apple.will_go_bad()
Fruit.will_go_bad()
  • 从空间上理解,静态方法 will_go_bad() 只是定义在类这个空间(类命名空间)中,没有任何特殊的cls 或者self 的绑定,它也不能访问类里任何的对象或者方法。和全局函数不同的是,它只能通过访问类这个空间来调用。静态方法用于处理类外部依赖的交互。
  • 从逻辑上理解,坏天气会影响水果的好坏;但坏天气和水果之间是不能互相访问的,只能通过某种逻辑进行关联。