方法定义

类的方法与普通函数基本上没有什么区别,唯一的区别是它们必须有一个额外的第一个参数名称,在惯例上,这个参数命名为self,也可以根据其他语言的习惯使用this,但是这样并不Pythonic。

这里的参数self代表的是类的实例,而不是类。读者可以在交互式解析器中运行以下示例来查看self的代表。

class Test:
	def prt(self):
		print(self)
		print(self.__class__)

t = Test()
t.prt()

如果使用@classmethod修饰符对一个方法进行修饰,并将第一个参数由self更换为cls(即class,但class为关键字不能够作为参数名称使用),这个方法则会成为类方法。类方法通过类来调用,而不是类实例。类方法的第一个参数cls代表类本身,其不能访问任何实例变量和实例方法,但可以访问类变量。

第三种特殊的方法则是静态方法,这种方法使用修饰器@staticmethod修饰,其定义不包含self或者cls等任何参数。静态方法即不会影响类,也不会影响类的对象,它们的存在仅是因为代码组织的规范,其调用方法与类方法相同。

以下示例演示了类方法与静态方法的定义和使用,读者可自行在交互式解释器中试验。

class A:
	count = 0 # 注意这个变量的级别,这是一个类变量

	def __init__(self):
		A.count += 1 # 这里使用类特性,而不是对象的特性

	@classmethod
	def children(cls):
		print("Has {0} children".format(cls.count))
	
	@staticmethod
	def standalone():
		print("A static method")

ch1 = A()
ch2 = A()
ch3 = A()

A.children()
A.standalone()