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参数,它是一个和类有关系,但是却在运行时又不需要实例或类参与的方法,类和实例都可以进行调用。
浙公网安备 33010602011771号