1.类方法
类方法是从属于"类对象"的方法。类对象可以通过装饰器@classmethod来定义,具体格式如下:
1
2
3
|
@classmethod
def 类方法名( cls [, 形参列表]):
方法体
|
要点如下:
- @classmethod必须位于方法的上面一行
- 第一个参数cls(class的缩写,和前面笔记介绍的self类似),必须要有,代指"类对象"本身。
- 调用类方法格式:类名.类方法名(参数列表)。参数列表中不需要也不能给cls参数进行传值,解释器会自动赋值。
- 类方法中可以访问实例属性和实例方法会导致错误,因为有类不一定有对象。
- 子类继承父类方法时,传入cls是自身对象,而非父类对象。(后面的笔记会有介绍)
代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Student:
count = 0 # 类属性
"""定义方法"""
@classmethod
def print_count( cls ):
"""cls参数代表类对象"""
print (Student.count)
"""调用类方法"""
print ( "调用时,不传递cls参数" )
Student.print_count()
|
运行结果:
调用时,不传递cls参数
0
2.静态方法
在python中,允许定义于”类对象“无关的方法,称为"静态方法"。
"静态方法"和在模块中定义的普通方法没有什么区别,只不过"静态方法"放到了"类的名字变量空间",需要通过类调用。
静态方法通过装饰器@staticmethod来定义,格式如下:
1
2
3
|
@staticmethod
def 静态方法名([形参列表]):
方法体
|
要点如下:
- @staticmethod必须位于方法上面一行
- 调用静态方法格式:类名.静态方法名(参数列表)
- 静态方法中访问实例属性和实例方法会导致错误
代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Student:
count = 0 # 类属性
@staticmethod
def add(a, b):
"""与类无关的静态方法"""
"""因为静态方法从属于类,所以是可以操作类属性和类方法"""
print ( "{0}+{1}={2}" . format (a, b, a + b))
return a + b
# 调用静态方法
Student.add( 20 , 30 )
|
运行结果:
20+30=50
res=50
3.实例方法/类方法/静态方法的区别
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
class MyClass:
# 类属性
class_attr = 0
def __init__( self , obj_attr):
self .obj_attr = obj_attr
def instance_method( self ):
return "instance method called" , self
@classmethod
def class_method( cls ):
return "class method called" , cls
@staticmethod
def static_method():
return "static method called"
print ( "调用实例方法" )
obj1 = MyClass( "obj_attr1" )
print (obj1.instance_method())
print ( "--" * 20 )
print ( "调用类方法" )
print (MyClass.class_method())
print ( "--" * 20 )
print ( "调用静态方法" )
print (MyClass.static_method())
|
运行结果:
调用实例方法
('instance method called', <__main__.MyClass object at 0x10ca93310>)
----------------------------------------
调用类方法
('class method called', <class '__main__.MyClass'>)
----------------------------------------
调用静态方法
static method called
注意: 以下讨论的属性、方法均指公开的类型,非私有的。
实例方法:
- 能读取、修改实例属性
- 能调用实例方法
- 能读取、修改类属性
- 能调用类方法
- 能调用类静态方法
- 调用方式:对象名.实例方法名(参数列表),编译器自动传递self参数
类方法:
- 不能读取、修改实例属性
- 不能用实例方法
- 能读取、修改类属性
- 能调用类方法
- 能调用类静态方法
- 调用方式:类名.类方法名(参数列表),编译器自动传递cls参数
静态方法:
- 不能读取、修改实例属性
- 不能用实例方法
- 能读取、修改类属性
- 能调用类方法
- 能调用类静态方法
- 调用方式: 类名.静态方法名(参数列表),不需要cls参数
- 类方法和静态方法,功能非常相近,可以相互替代, 但是从规范的角度来说,请按照实例方法操作对象,类方法操作类,静态方法为和类无关的通用方法。
以上就是浅谈python 类方法/静态方法的详细内容,更多关于类方法/静态方法的资料请关注服务器之家其它相关文章!
原文链接:http://www.niefajun.com/archives/python-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-09-%E7%B1%BB%E6%96%B9%E6%B3%95%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95