脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - Python中静态方法,类方法,属性方法使用方法

Python中静态方法,类方法,属性方法使用方法

2023-02-10 11:48Python热爱者 Python

这篇文章主要介绍了Python中静态方法,类方法,属性方法使用方法,文章围绕主题的相关资料展开详细内容,具有一定的参考价值,需要的小伙伴可以参考一下

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

延伸 · 阅读

精彩推荐
  • Pythonpython 如何对Series中的每一个数据做运算

    python 如何对Series中的每一个数据做运算

    这篇文章主要介绍了python 实现对Series中的每一个数据做运算操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    石小秀19957052021-11-09
  • Python用Python简陋模拟n阶魔方

    用Python简陋模拟n阶魔方

    这篇文章主要介绍了用Python简陋模拟n阶魔方,文中有非常详细的代码示例,对正在学习python的小伙伴呢有一定的帮助,需要的朋友可以参考下...

    Eyizoha12372021-10-13
  • PythonPyQt5响应回车事件的方法

    PyQt5响应回车事件的方法

    今天小编就为大家分享一篇PyQt5响应回车事件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    数学工具构造器8172021-07-21
  • Pythonpython 实现selenium断言和验证的方法

    python 实现selenium断言和验证的方法

    今天小编就为大家分享一篇python 实现selenium断言和验证的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    黑面狐7222021-05-28
  • PythonPython爬取哆啦A梦-伴我同行2豆瓣影评并生成词云图

    Python爬取哆啦A梦-伴我同行2豆瓣影评并生成词云图

    哆啦A梦系列是陪伴我,乃至陪伴了几代人成长的故事.50年来,藤子·F·不二雄先生创造了竹蜻蜓,任意门,时光机器等等无数的新奇道具,让大雄和他的小伙伴们...

    数据分析与统计学之美11552021-11-21
  • Python关于python的list相关知识(推荐)

    关于python的list相关知识(推荐)

    下面小编就为大家带来一篇关于python的list相关知识(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    relax.19493762020-12-04
  • PythonPython中实现单例模式的n种方式和原理

    Python中实现单例模式的n种方式和原理

    这篇文章主要介绍了Python中实现单例模式的n种方式和原理,需要的朋友可以参考下...

    Python教程网3672021-04-19
  • PythonPython进阶学习之特殊方法实例详析

    Python进阶学习之特殊方法实例详析

    一般说来,特殊的方法都被用来模仿某个行为。下面这篇文章主要给大家介绍了关于Python进阶学习之特殊方法的相关资料,文中通过示例代码介绍的非常详...

    zhuzhezhe4992020-12-21