类方法/静态方法
类方法
方法的定义都是类级的,但是有的方法使用实例来调用,有的方法使用类来调用
当方法有self参数的时候,就只能是实例来访问,因为self是实例本身,当类调用的时候,因为没有实例化,所以不会主动传递实例到self参数,因此会抛出错误
实例方法只能由实例来访问
class I:
def print(self):
print('lanyulei is shuaige!!')
i = I()
i.print()
返回结果
>>> G
In [2]: I.print() # 当使用类名来访问方法的时候,就会抛出TypeError的错误,说没有传递self的参数
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-acb53bc932b5> in <module>()
----> 1 I.print()
TypeError: print() missing 1 required positional argument: 'self'
类可以直接访问的方法,在Python中是使用装饰器的形式来实现的,classmethod这个装饰器就可以实现让类和实例都可以访问方法
In [9]: class I():
...: @classmethod # 装饰器作用在方法上
...: def class_print(cls):
...: print(id(cls))
...: print('class is class')
...:
In [11]: I.class_print() # 直接使用类名访问方法
36126824
class is class
In [12]: i = I()
In [13]: i.class_print() # 使用实例访问方法
36126824
class is class
In [14]: id(I) # 获取类的唯一ID,在类中同时获取了方法的第一个参数的id,可以看到,类的id和方法的第一个id是相同,说明给第一个参数的传递的是类本身
Out[14]: 36126824
In [15]: id(i) # 获取实例的id,实例的id和类中方法的第一个参数id是不一致的
Out[15]: 140708638747168
类和实例是否能调用方法,是通过方法传递的一个参数来决定的,当传递的参数是类本身的时候,就是类方法,同时类方法也是能被实例调用的;当传递的参数是实例本身的话,就是实例方法,实例方法类是不能直接调用的
类方法,最大的一个用处就是无需实例化就能执行
静态方法
静态方法也是使用装饰器来实现的
当使用了staticmethod的装饰方法的时候,就不会自动传递第一个参数了,这样的方法叫做静态方法
In [16]: class I:
...: @staticmethod
...: def static_print():
...: print('static')
...:
In [17]: I.static_print()
static
In [18]: i = I()
In [20]: i.static_print()
static
有一种方法是实例是不能调用的
In [21]: class I:
...: def xxx_print(): # 这个方法其实就是这个类的作用域下面的一个函数,第一个参数自动的传入的类本身
...: print('xxx')
...:
In [22]: I.xxx_print() # 使用类调用
xxx
In [23]: i = I()
In [24]: i.xxx_print() # 使用实例调用,抛出的TypeError的错误
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-24-534c1da2d61e> in <module>()
----> 1 i.xxx_print()
TypeError: xxx_print() takes 0 positional arguments but 1 was given