类对象/实例对象/类方法/实例方法/静态方法

  • 类对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A(object):
def m1(self, n):
print("self:", self)

@classmethod
def m2(cls, n):
print("cls:", cls)

@staticmethod
def m3(n):
pass

a = A()
a.m1(1) # self: <__main__.A object at 0x000001E596E41A90>
A.m2(1) # cls: <class '__main__.A'>
A.m3(1)

按顺序执行时,执行class A()创建了A这个类对象
  • 实例对象
1
2
3
4
#接源码
a = A()
是对类对象A的实例化,创建了实例对象a,也可以说a绑定了实例对象

  • 类方法
1
2
3
4
5
#接源码
@classmethod
def m2(cls, n):
print("cls:", cls)

类中@classmethod下方的是类方法,写法也是固定写法;其中cls必须要有,cls绑定了类对象A(),在类外部,需要这样引用A(类对象).类方法 ;因为类方法在类中能被直接引用,一般是这样引用self.类方法;这是由于self绑定的是实例对象,根据实例对象可以查找到类对象

  • 使用场景

    如果希望在方法裡面调用静态类,那么把方法定义成类方法是合适的,因为要是定义成静态方法,那么你就要显示地引用类A,这对继承来说可不是一件好事情。(为了方便调用,但又为了继承方便,因此不用静态方法,显示调用)

  • 实例方法

1
2
def m1(self, n):
print("self:", self)

实例方法,必须带self;其中self绑定的实例对象a;因此外部使用可以这样使用,a.m1();在类的内部self绑定了实例对象,因此可以直接使用self.m1来调用

  • 使用场景

    需要将方法作为对象属性,进行调用,继承,传递的方法,大部分类方法都会定义成实例方法;

  • 静态方法

1
2
3
4
5
6
7
8
9
@staticmethod
def m3(n):
pass

静态方法,就是普通函数;和类对象和实例对象均无绑定关系;
即可被类调用,也可通过实例调用;
A.m3()
a.m3()
self.m3
  • 使用场景

    如果在方法中不需要访问任何实例方法和属性,纯粹地通过传入参数并返回数据的功能性方法,那么它就适合用静态方法来定义,它节省了实例化对象的开销成本,往往这种方法放在类外面的模块层作为一个函数存在也是没问题的,而放在类中,仅为这个类服务(定义了一个局部域函数仅为该类专门服务)。

  • 装饰器

1
2
3
4
5
6
7
8
def A(FUN):
return FUN+1

@FUN
def b():
print('hello')

在装饰器中@后跟的是父方法,注意类方法/静态方法/装饰器方法区别

参考

欢迎关注我的其它发布渠道