Python学习之路(22)——静态方法@staticmethod和类成员方法@classmethod

Python的静态方法和类成员方法都可以被类对象或实例对象访问,但静态方法无需传入任何参数,类成员方法必须传入代表本类的cls参数;

 

我们先看一个实例方法的例子:

>>> class A(object):
	def foo(self):
		print('Hello', self)

		
>>> a = A()
>>> a.foo()
Hello <__main__.A object at 0x0000000003695668>
>>> A.foo()
Traceback (most recent call last):
  File "<pyshell#98>", line 1, in <module>
    A.foo()
TypeError: foo() missing 1 required positional argument: 'self'

这里我们定义了一个类A,类里有一个实例方法foo(参数为self),然后创建一个实例对象a,并调用方法foo。

 

如果我们想通过类来调用方法,而不是通过实例,可以使用@classmethod装饰器来实现,如下:

>>> class A(object):
	bar = 1
	def foo(self):
		self.value = 2
		return self.value
	@classmethod
	def class_foo(cls):
		print('Hello, ', cls)
		print(cls.bar)
		print(cls.foo(A()))
		try:
			print(cls.value)
		except:
			print("Error")

			
>>> A.class_foo()
Hello,  <class '__main__.A'>
1
2
Error
>>> 

这里我们使用@classmethod装饰方法class_foo,因此就变成一个类成员方法,参数为cls(代表类本身)。当我们调用A.class_foo()时,cls就会接收A作为参数。另外,被@classmethod装饰的方法由于持有cls参数,因此,可以在方面里面调用类的属性、方法,比如cls.bar和cls.foo()。

 

而在类中往往有一些方法和类有关系,但是又不会改变类和实例状态的方法,这种方法叫静态方法,我们使用@staticmethod来装饰。如下例:

>>> class A(object):
	bar = 1
	@staticmethod
	def static_foo():
		print('Hello, ', A.bar)

		
>>> a = A()
>>> a.static_foo()
Hello,  1
>>> A.static_foo()
Hello,  1

  

可以看出,静态方法没有传入self或cls参数,它是一个和类有关系,但是却在运行时又不需要实例或类参与的方法,类和实例都可以进行调用。

 

posted on 2018-03-06 14:45  nicolas_Z  阅读(167)  评论(0)    收藏  举报

导航