一段代码搞明白类的①实例方法、②类方法和③静态方法

1. 例子

class Dog:
    # 定义类变量(类属性)
    dogbook = {"黄色": 30, "黑色": 20, "白色": 0}

    def __init__(self, name, color, weight) -> None:
        self.name = name
        self.color = color
        self.weight = weight

        if self.color in self.dogbook:
            self.dogbook[self.color] += 1
        else:
            self.dogbook[self.color] = 1

    # 定义实例方法(定义时,必须把self作为第一个参数),该方法可以访问实例变量(属性)。调用时必须通过实例名来调用,不能通过类名来调用
    def bark(self):
        print(f"{self.name} is barking!")

    # 定义类方法(定义时,必须把cls作为第一个参数)。该方法可以访问类变量(属性),可以通过实例名来调用,也可以通过类名来调用
    @classmethod
    def dog_num(cls):
        num = 0
        for val in cls.dogbook.values():
            num += val
        return num

    """
        定义静态方法(定义式,不需要把self和cls作为第一个参数)。静态方法就是普通的函数,它对类和实例都一无所知。
        不能访问类变量,也不能访问实例变量。可以通过实例名来调用,也可以通过类名来调用
        静态方法写在类外面也是可以的,写在类里面只是因为这个函数和类有一定的关系,逻辑上更加易懂!
    """

    @staticmethod
    def total_weights(形参):
        total = 0
        for val in 形参:
            total += val.weight
        return total


if __name__ == "__main__":
    print(f"共有 {Dog.dog_num()} 条狗")

    dog_1 = Dog(name="大黄", color="黄色", weight=10)
    dog_1.bark()
    print(f"共有 {Dog.dog_num()} 条狗")

    try:
        Dog.bark()
    except:
        print("不能通过类名调用实例方法!")

    dog_2 = Dog(name="旺财", color="灰色", weight=8)
    dog_2.bark()
    print(f"共有 {Dog.dog_num()} 条狗")

    print(f"狗的重量为: {Dog.total_weights(形参=[dog_1, dog_2])}")

运行结果:

共有 50 条狗
大黄 is barking!
共有 51 条狗
不能通过类名调用实例方法!
旺财 is barking!
共有 52 条狗
狗的重量为: 18

2. 总结

名称 装饰器 定义 是否可以访问实例变量 实例名调用 类名调用
实例方法 必须把self作为第一个参数 ×
类方法 @classmethod 必须把cls作为第一个参数
静态方法 @staticmethod 等价于普通函数 ×

3. 注意事项

  1. 默认创建的方法都是实例方法
  2. 类方法在创建时第一个参数必须是cls,不能缺省
  3. 静态方法不可以传入self,会报错(因为静态方法本质上就是普通的函数,传入的self会被认为是一个形参)!

4. 参考

  1. https://www.bilibili.com/video/BV13741167D8/

你可能感兴趣的:(Python,python)