写点什么

python 小知识 -classmethod 类方法

作者:AIWeker
  • 2022-11-03
    福建
  • 本文字数:1114 字

    阅读完需:约 4 分钟

python小知识-classmethod类方法

python 类提供了三种不同的方法:


  • 普通方法:参数带 self, 是类实例化才能访问的方法,

  • 静态方法:@staticmethod 装饰的方法,通常是与类对象无关的方法,如工具计算,类可直接调用

  • 类方法:@classmethod 装饰的方法,参数有一个隐含参数 cls,表示类本身,类可以直接调用


我们来看一下例子:


class Person(object):    a = 0    def __init__(self, name, age):        self.name = name        self.age = age        def info(self):        print( 'name={}'.format(self.name), 'age={}'.format(self.age))            def change_age(self):        self.age = self.age + self.a        @classmethod    def add(cls):        print("classmethod a id = ", id(cls.a))        cls.a = cls.a + 1            @classmethod    def create_engineer(cls, name, age):        return cls('engineer:{}'.format(name), age)        @staticmethod    def bmi(height, kg):        return kg / height ** 2
复制代码


wedo = Person('wedo', 30)wedo.change_age()wedo.info()print('a = {}'.format(Person.a))
# name=wedo age=30# a = 0
wedo2 = Person('wedo2', 35)wedo2.change_age()wedo2.info()print('a = {}'.format(Person.a))
# name=wedo2 age=35# a = 0
复制代码


从上面调用例子来看,


  • wedo/wedo2 是 Person 类的一个实例对象,

  • a 是 Person 类属性同时所有实例共享的属性

  • name 和 age 是类实例属性, 不同实例值可以不同。


让我们来通过类方法来修改下类属性 a



Person.add()print('a = {}'.format(Person.a))
# classmethod a id = 1644522528# a = 1
wedo2.change_age()wedo2.info()print('a = {}'.format(Person.a))
wedo.change_age()wedo.info()print('a = {}'.format(Person.a))
# name=wedo2 age=36# a = 1# name=wedo age=31# a = 1
wedo.add()print('a={}'.format(Person.a), 'wedo 2 a={}'.format(wedo2.a))# classmethod a id = 1644522560# a=2 wedo2-a=2
复制代码


从上可知,类方法可以通过 Person 类直接调用(当然也可以实例调用),来改变不同实例的共享类属性。在类方法中通过 cls 来表示类本身,以便访问类本身的属性;当然也可以创建类的实例。


在上面的例子,我们通过类方法 create_engineer,实现了新的 Person 的初始化实例。


engineer = Person.create_engineer('wedo3', 40)engineer.info()# name=engineer:wedo3 age=40
复制代码


那么类方法的作用是什么?总结一下


  • 类方法可以统一控制类属性,并影响所有实例对象;这在需要对所有实例进行同步控制的时候特别有用

  • 类方法,可以向工厂方法一样,重新定义类的实例化;这可以在处理不同初始化的的情况使用


希望以上,对你有帮助

发布于: 刚刚阅读数: 2
用户头像

AIWeker

关注

InfoQ签约作者 / 公众号:人工智能微客 2019-11-21 加入

人工智能微客(aiweker)长期跟踪和分享人工智能前沿技术、应用、领域知识,不定期的发布相关产品和应用,欢迎关注和转发

评论

发布
暂无评论
python小知识-classmethod类方法_Python_AIWeker_InfoQ写作社区