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
那么类方法的作用是什么?总结一下:
- 类方法可以统一控制类属性,并影响所有实例对象;这在需要对所有实例进行同步控制的时候特别有用
- 类方法,可以向工厂方法一样,重新定义类的实例化;这可以在处理不同初始化的的情况使用
希望以上,对你有帮助。