@classmethod和@staticmethod详解

一、python中的方法

python的类定义中存在三种方法,分别为常规实例方法(定义中传入self,也是我们最常用的方法)、@classmethod修饰的类方法、@staticmethod修饰的静态方法。

class Car:
    colornum = {'blue':10, 'black':20, 'red':30}
    
    def __init__(self, make, color, weight):
        self.make = make
        self.color = color
        self.weight = weight
        
    def get_descriptive_name(self):
        print('{} is very cool.'.format(self.make))
    
    @classmethod
    def car_num(cls):
        num = 0
        for i in cls.colornum.values():
            num += i
            return num 
    @staticmethod
    def total_weights(cars):
        total = 0
        for c in cars:
            total += total + c.weight
            
        return total
        

以上代码为例,实现了常规实例方法、类方法,静态方法。需要注意colornum = {‘blue’:10, ‘black’:20, ‘red’:30}为类变量,_init()包含的为实例变量。

1、常规实例方法get_descriptive_name()

c1 = Car('Audi','black',3)
c1.get_descriptive_name()

定义时必须把self作为第一个参数,调用时需要先实例化类,可以通过该实例访问实例变量,只能通过创建的实例名进行访问。不能直接用类名Car.get_descriptive_name()的方式来调用。
例如:
调用c1.get_descriptive_name()
即打印,Audi is very cool.

2、类方法car_num()
定义是需要把cls(代表当前类)作为第一个参数,表示该方法与类绑定(不是实例),在该函数内部可以调用属于类的专有属性(一般来说定义在__init__外面的属性如上面的colornum)。可以直接用Car.car_num()来调用,当然也可以直接实例化,通过实例来调用。

Car.car_num()
c1.car_num()

两种方法均可。

3.静态方法total_weights()

静态方法不强制传入self或者cls,该方法不能访问类或者实例的变量,相当于定义在类外面的普通方法。只不过此方法与定义的类相关,所以才会放在类的内部。可以通过实例名或者类的名字访问。

c3 = Car('Audi','red',2)
c4 = Car('Benz','red',2.3)

Car.total_weights([c3, c4])

如代码所示,调用了静态方法。

如有疑问,请评论或留言咨询!

发布了9 篇原创文章 · 获赞 18 · 访问量 3069

猜你喜欢

转载自blog.csdn.net/qq_45032341/article/details/105157812