Python中classmethod和staticmethod的区别

学习python中经常会出现一些相近或者相似的语法模块等,需要对比分析才能加深记忆,熟练运用。

staticmethod:静态方法

classmethod:类方法

在python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是:

@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。
普通对象方法至少需要一个self参数,代表类对象实例
类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。
静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少。

1.一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法

而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。

这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

2.既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢

从它们的使用上来看,

  • @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
  • @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。

如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名

而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

 1 # -*- coding=utf-8 -*-
 2 # @Time    : 2019/12/02 19:51 加班学习
 3 # @Software: PyCharm
 4 # @Author Jacky
 5 
 6 class Foo(object):
 7 
 8     # 实例方法,第一个参数必须是实例对象。一般习惯用self。
 9     def instance_method(self):
10         print("是类{}的实例方法,只能被实例对象调用".format(Foo))
11 
12     # 类方法, 第一个参数必须是类 对象。一般习惯使用cls。使用@classmethod装饰器装饰。
13 
14     @classmethod
15     def class_method(cls):
16         print("是类方法")
17 
18 
19     # 静态方法,参数没有要求,和类没有绑定关系,就是一个普通的方法            使用@staticmethod装饰器装饰。
20     @staticmethod
21     def static_method():
22         print("是静态方法")
23 
24 
25 foo = Foo()
26 
27 
28 # 实例方法只能被实例调用
29 foo.instance_method()
30 print('==========')
31 
32 # 类方法可以被类或者实例调用。
33 Foo.class_method()
34 foo.class_method()
35 
36 print('----------')
37 
38 # 静态方法可以被类或者实例调用。
39 Foo.static_method()
40 foo.static_method()
41 
42 
43 '''
44 是类<class '__main__.Foo'>的实例方法,只能被实例对象调用
45 ==========
46 是类方法
47 是类方法
48 ----------
49 是静态方法
50 是静态方法
51 '''
View Code

小结:

理解classicmethod和staticmethod类是一种数据结构,可以创建对象。当调用类的时候就创建了一个类的实例对象。一旦对象被创建,python 就会检查是否实现了init()方法。如果init()已经被实现,那么它将被调用,实例对象作为第一个参数(self)被传递进去。

猜你喜欢

转载自www.cnblogs.com/pythonbetter/p/11972913.html
今日推荐