python中的类方法(@classmethod)

python做面向对象编程时候,经常需要使用classmethod的描述。类方法特别容易弄混淆,因为听起来就好像“类中的方法”一样。

类方法也算一种实用的技巧,简单描述之:“类方法让类模板具有记忆力”。

类模板就是我们所定义的类。在普通情况下,不使用类方法对类进行实例化,类本身是不具有记忆性的只是当一个静态模板被套用多次而已。如果我们想让类在每一次实例化之后,都能记载一些记忆,是否会对很多操作很有用?

我们来看一个栗子:

class Man:
    id = 0 # 类变量
    def __init__(self, name):
        self.name = name
        self.id = self.id_number()

    @classmethod
    def id_number(cls):
        cls.id += 1
        return cls.id

a = Man('A')
print(a.id)
b = Man('B')
print(b.id)

上面的输出为:

1
2

我对Man这个类进行实例化2次,每个实例的id都不一样。这就依靠类方法来实现了:首先,用@classmethod描述类方法,然后用"cls"代表本类类方法对类属性进行的处理是有记忆性的

需要注意的是,类方法处理的变量一定要是类变量。因为在类方法里你用不了self来寻址实例变量,所以需要把类变量放到最前面描述,如上面的"id=0"所示。类变量是可以被self访问的,所以,在类变量定义好了以后,不需要在_init_函数里对类变量再一次描述。所以,上面代码里self.id不一定需要。

对于研究深度学习的朋友,可以有效利用这个trick,来进行模型的加载。比如,把模型封装成一个类,把初始化网络和加载模型用类方法来描述,这样一次load之后,可以一直实用模型。

发布了147 篇原创文章 · 获赞 1858 · 访问量 90万+

猜你喜欢

转载自blog.csdn.net/leviopku/article/details/100745811