一个案例帮你理解python类(class)中的:实例方法、静态方法(@staticmethod)、类方法(@classmethod)
class Dog:
# 类变量:每个类的类变量是相同的
# 所有的狗类都会有同一个dogbook,因此dogbook不是一个实例,并且属于狗类。
dogbook = {"黄色": 30, "黑色": 20, "白色": 0}
# 实例变量:每个实例的实例变量可以不同
def __init__(self, name, color, weight): # 每个狗都有不一样的属性,则这些是狗的实例。
self.name = name
self.color = color
self.weight = weight
# 此处省略若干行,应该更新dogbook的数量
# 实例方法: 定义时,必须把self作为第一个参数,可以访问实例变量,只能通过实例名访问
# 当然,调用的时候python会自动帮忙上传self参数,但是,这就意味着,实例方法是必须通过实例名访问
# 如果不实例调用:Dog.bark() 报错:# TypeError: bark() missing 1 required positional argument: 'self'
# Dog.bark 只会打印 function 的名字:# <function __main__.Dog.bark(self)>
def bark(self):
print(f"{self.name} 叫了起来")
# 类方法:定义时,必须把类作为第一个参数,可以访问类变量,可以通过实例名或类名访问
# 也就是说使用 Dog.dog_num() 和 Dog().dog_num() 结果是一样的。
@classmethod
def dog_num(cls):
num = 0
for v in cls.dogbook.values():
num = num + v
return num
# 静态方法:不强制传入self或者cls, 他对类和实例都一无所知。不能访问类变量,也不能访问实例变量;可以通过实例名或类名访问。
# 静态方法可以写在类外面也可以写在类里面,写在类里面的原因是与这个类息息相关的。
@staticmethod
def total_weights(dogs):
total = 0
for o in dogs:
total = total + o.weight
return total
print(f"共有 {Dog.dog_num()} 条狗")
d1 = Dog("大黄", "黄色", 10)
d1.bark()
print(f"共有 {d1.dog_num()} 条狗")
d2 = Dog("旺财", "黑色", 8)
d2.bark()
print(f"狗共重 {Dog.total_weights([d1, d2])} 公斤")
- 结果
共有 50 条狗
大黄 叫了起来
共有 50 条狗
旺财 叫了起来
狗共重 18 公斤
- 参考视频
b站:麦叔编程