Python中静态方法,类方法,属性方法怎么使用
本篇内容介绍了“Python中静态方法,类方法,属性方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
1.静态方法
通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法
应用:
对与一个类,我们要调用它的一个方法,必须要绑定实例,而不能直接通过类名.方法名()的形式调用。因此,想要通过类来调用方法,而不是通过实例,可以使用静态方法@staticmethod和类方法@classmethod的形式实现。
#静态方法 只是名义上归类管理,实际上在静态方法里访问不了类或实例中 的任何属性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装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量
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把一个方法变成一个静态属性
'''学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!'''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.eatd.eat='baozi'
实际场景应用:
比如 ,你想知道一个航班当前的状态,是到达了、延迟了、取消了、还是已经飞走了, 想知道这种状态你必须经历以下几步:
连接航空公司API查询
对查询结果进行解析
返回结果给你的用户
因此这个status属性的值是一系列动作后才得到的结果,所以你每次调用时,其实它都要经过一系列的动作才返回你结果,但这些动作过程不需要用户关心, 用户只需要调用这个属性就可以了
class Flight(object):def __init__(self, name):self.flight_name = namedef checking_status(self):print("checking flight %s status " % self.flight_name)return 1@propertydef 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_statusf.flight_status = 2 # 触发@flight_status.setterdel f.flight_status # 触发@flight_status.deleter
“Python中静态方法,类方法,属性方法怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341