Python实例方法、类方法和静态方法举例理解
一次性理解实例方法、静态方法和类方法。
今天的对象:
- @classmethod 类方法;
- @staticmethod 静态方法;
- 普通实例方法;
1. 基本类
先写从普通的一个类写起:
class Fruit(object):
def __init__(self, name):
self.name = name
apple = Fruit('apple')
这个时候,我们称Fruit
为class(类)
,apple
为instance(实例)
。
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
的绑定,它也不能访问类里任何的对象或者方法
。和全局函数不同的是,它只能通过访问类这个空间来调用。静态方法用于处理类外部依赖的交互。 - 从逻辑上理解,坏天气会影响水果的好坏;但坏天气和水果之间是不能互相访问的,只能通过某种逻辑进行关联。