1.  
  2. 主页
  3.  / 
  4. Python基础到高级
  5.  / 
  6. 面向对象
  7.  / 
  8. 类方法/静态方法

类方法/静态方法

类方法/静态方法

类方法

方法的定义都是类级的,但是有的方法使用实例来调用,有的方法使用类来调用

当方法有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
这篇文章对您有用吗?

我们要如何帮助您?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注