静态方法和类方法
Python类包含三种方法:实例方法、静态方法和类方法。
其中,要想调用实例方法,必须要实例化类,然后才可以调用。也就是说,调用实例化方法需要类的实例(对象)。
静态方法在调用时根本不需要类的实例(静态方法不需要self参数),这一点和其他编程语言完全一样。
类方法的调用方式与静态方法完全一样,所不同的是,类方法与实例方法的定义方式相同,都需要一个self参数,只不过这个self参数的含义不同。对于实例方法来说,这个self参数就代表当前类的实例,可以通过self访问对象中的方法和属性。而类方法的self参数表示类的元数据,也就是类本身,不能通过self参数访问对象中的方法和属性,只能通过这个self参数访问类的静态方法和静态属性。
定义静态方法需要使用@staticmethod装饰器(decorator),定义类方法需要使用@classmethod装饰器。
class Myclass:
name = 'Bill' # 定义一个静态变量,可以被静态方法和类方法访问
def __init__(self):
print('Myclass的构造方法被调用')
self.value = 20 # 定义实例变量,静态方法和类方法不能访问该变量
@staticmethod # 定义静态方法
def run():
print('*', Myclass.name, '*') # 访问Myclass类中的静态变量name
print('Myclass的静态方法run被调用')
@classmethod # 定义类方法
def do(self): # 这里self是类的元数据,不是类的实例
print(self)
print('[', self.name, ']') # 访问Myclass类中的静态变量name
print('调用静态方法run')
self.run()
print('成员方法do被调用')
#在类方法中不能访问实例变量,否则会抛出异常(因为实例变量需要用类的实例访问)
#print(self.value)
def do1(self): # 定义实例方法
print(self.value)
print('<', self.name, '>')
print(self)
Myclass.run() # 调用静态方法run
c = Myclass() # 创建Myclass类的实例
c.do() # 通过类的实例也可以调用类方法
print('Myclass2.name', '=', Myclass.name)# 通过类访问类的静态变量
Myclass.do() # 通过类调用类方法
c.do1() # 通过类的实例访问实例方法