一个案例帮你理解python类(class)中的:实例方法、静态方法(@staticmethod)、类方法(@classmethod)

一个案例帮你理解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 公斤
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jacob-xyb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值