1.静态方法
通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法
应用:
对与一个类,我们要调用它的一个方法,必须要绑定实例,而不能直接通过类名.方法名()的形式调用。因此,想要通过类来调用方法,而不是通过实例,可以使用静态方法@staticmethod和类方法@classmethod的形式实现。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#静态方法 只是名义上归类管理,实际上在静态方法里访问不了类或实例中 的任何属性 class Dog( object ): def __init__( self ,name): self .name = name @staticmethod #实际上跟类本身已没什么关系,只是名义上是类的方法(与类无关,不能访问类里的任何属性和方法) def eat( self ,name): print ( "%s is eating %s" % ( self .name,name)) d = Dog( 'sb' ) # d.eat('baozi')#出错 原因是eat需要一个self参数,但调用时却没有传递,没错,因为当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了 #解决办法 #1.调用时主动传递实例本身给eat方法#在eat中去掉self参数,但这也意味着,在eat中不能通过self.调用实例中的其他变量了 d.eat(d, 'baozi' ) #执行结果 >>>sb is eating baozi |
2.类方法
类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Dog( object ): name = 'SB' #类变量 def __init__( self ,name): self .name = name @classmethod #类方法只能访问类变量,不能访问实例变量 def eat( self ,name): print ( '%s is eating %s' % ( self .name,name)) def talk( self ,something): print ( "%s is talking %s" % ( self .name,something)) d = Dog( 'Lulu' ) d.eat( 'Mantou' ) #执行结果 SB is eating Mantou |
3.静态方法与类方法总结
静态方法其实就是一个定义在类中的方法,只是调用时可以不需要先对类进行实例化,直接用类调用即可。无论后面怎么继承,它的实现不变。
类方法也在调用时也不需要先对类进行实例化,但是它的实现,在继承时是跟随当前的子类的(因为它的第一个参数永远是cls)
它们常用于将数据预处理等封装在类内,避免代码扩散到类外不好维护
4.属性方法
属性方法的作用就是通过@property把一个方法变成一个静态属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Dog( object ): name = 'suantou' def __init__( self ,name): self .name = name @property #把一个方法变成一个静态属性 def eat( self ): print ( '%s is eating %s' % ( self .name, 'something' )) @eat .setter #为eat属性赋值 def eat( self ,food): print ( 'set to food' ,food) def talk( self ,something): print ( "%s is talking %s" % ( self .name,something)) d = Dog( 'Lulu' ) #d.eat('baozi')出错 说NoneType is not callable, 因为eat此时已经变成一个静态属性了, 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了 d.eat d.eat = 'baozi' |
实际场景应用:
比如 ,你想知道一个航班当前的状态,是到达了、延迟了、取消了、还是已经飞走了, 想知道这种状态你必须经历以下几步:
- 连接航空公司API查询
- 对查询结果进行解析
- 返回结果给你的用户
因此这个status属性的值是一系列动作后才得到的结果,所以你每次调用时,其实它都要经过一系列的动作才返回你结果,但这些动作过程不需要用户关心, 用户只需要调用这个属性就可以了
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
31
32
|
class Flight( object ): def __init__( self , name): self .flight_name = name def checking_status( self ): print ( "checking flight %s status " % self .flight_name) return 1 @property def flight_status( self ): status = self .checking_status() if status = = 0 : print ( "flight got canceled..." ) elif status = = 1 : print ( "flight is arrived..." ) elif status = = 2 : print ( "flight has departured already..." ) else : print ( "cannot confirm the flight status...,please check later" ) @flight_status .setter # 修改 def flight_status( self , status): status_dic = { 0 : "canceled" , 1 : "arrived" , 2 : "departured" } print ( "\033[31;1mHas changed the flight status to \033[0m" , status_dic.get(status)) @flight_status .deleter # 删除 def flight_status( self ): print ( "status got removed..." ) f = Flight( "CA980" ) f.flight_status f.flight_status = 2 # 触发@flight_status.setter del f.flight_status # 触发@flight_status.deleter |
到此这篇关于Python中静态方法,类方法,属性方法使用方法的文章就介绍到这了,更多相关Python静态方法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.51cto.com/u_14246112/5307051