应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Python中怎么给属性增加类型检查或合法性验证?

  问题
  你想给某个实例attribute增加除访问与修改之外的其他处理逻辑,比如类型检查或合法性验证。解决方案
  自定义某个属性的一种简单方法是将它定义为一个property。例如,下面的代码定义了一个property,增加对一个属性简单的类型检查:classPerson:definit(self,firstname):self。firstnamefirstnameGetterfunctionpropertydeffirstname(self):returnself。firstnameSetterfunctionfirstname。setterdeffirstname(self,value):ifnotisinstance(value,str):raiseTypeError(Expectedastring)self。firstnamevalueDeleterfunction(optional)firstname。deleterdeffirstname(self):raiseAttributeError(Cantdeleteattribute)
  上述代码中有三个相关联的方法,这三个方法的名字都必须一样。第一个方法是一个getter函数,它使得firstname成为一个属性。其他两个方法给firstname属性添加了setter和deleter函数。需要强调的是只有在firstname属性被创建后,后面的两个装饰器firstname。setter和firstname。deleter才能被定义。property的一个关键特征是它看上去跟普通的attribute没什么两样,但是访问它的时候会自动触发getter、setter和deleter方法。例如:aPerson(Guido)a。firstnameCallsthegetterGuidoa。firstname42CallsthesetterTraceback(mostrecentcalllast):Filestdin,line1,inmoduleFileprop。py,line14,infirstnameraiseTypeError(Expectedastring)TypeError:Expectedastringdela。firstnameTraceback(mostrecentcalllast):Filestdin,line1,inmoduleAttributeError:cantdeleteattribute
  在实现一个property的时候,底层数据(如果有的话)仍然需要存储在某个地方。因此,在get和set方法中,你会看到对firstname属性的操作,这也是实际数据保存的地方。另外,你可能还会问为什么init()方法中设置了self。firstname而不是self。firstname。在这个例子中,我们创建一个property的目的就是在设置attribute的时候进行检查。因此,你可能想在初始化的时候也进行这种类型检查。通过设置self。firstname,自动调用setter方法,这个方法里面会进行参数的检查,否则就是直接访问self。firstname了。还能在已存在的get和set方法基础上定义property。例如:classPerson:definit(self,firstname):self。setfirstname(firstname)Getterfunctiondefgetfirstname(self):returnself。firstnameSetterfunctiondefsetfirstname(self,value):ifnotisinstance(value,str):raiseTypeError(Expectedastring)self。firstnamevalueDeleterfunction(optional)defdelfirstname(self):raiseAttributeError(Cantdeleteattribute)Makeapropertyfromexistinggetsetmethodsnameproperty(getfirstname,setfirstname,delfirstname)讨论
  一个property属性其实就是一系列相关绑定方法的集合。如果你去查看拥有property的类,就会发现property本身的fget、fset和fdel属性就是类里面的普通方法。比如:Person。firstname。fgetfunctionPerson。firstnameat0x1006a60e0Person。firstname。fsetfunctionPerson。firstnameat0x1006a6170Person。firstname。fdelfunctionPerson。firstnameat0x1006a62e0
  通常来讲,你不会直接去调用fget或者fset,它们会在访问property的时候自动被触发。只有当你确实需要对attribute执行其他额外的操作的时候才应该使用到property。有时候一些从其他编程语言(比如Java)过来的程序员总认为所有访问都应该通过getter和setter,所以他们认为代码应该像下面这样写:classPerson:definit(self,firstname):self。firstnamefirstnamepropertydeffirstname(self):returnself。firstnamefirstname。setterdeffirstname(self,value):self。firstnamevalue
  不要写这种没有做任何其他额外操作的property。首先,它会让你的代码变得很臃肿,并且还会迷惑阅读者。其次,它还会让你的程序运行起来变慢很多。最后,这样的设计并没有带来任何的好处。特别是当你以后想给普通attribute访问添加额外的处理逻辑的时候,你可以将它变成一个property而无需改变原来的代码。因为访问attribute的代码还是保持原样。Properties还是一种定义动态计算attribute的方法。这种类型的attributes并不会被实际的存储,而是在需要的时候计算出来。比如:importmathclassCircle:definit(self,radius):self。radiusradiuspropertydefarea(self):returnmath。piself。radius2propertydefdiameter(self):returnself。radius2propertydefperimeter(self):return2math。piself。radius
  在这里,我们通过使用properties,将所有的访问接口形式统一起来,对半径、直径、周长和面积的访问都是通过属性访问,就跟访问简单的attribute是一样的。如果不这样做的话,那么就要在代码中混合使用简单属性访问和方法调用。下面是使用的实例:cCircle(4。0)c。radius4。0c。areaNoticelackof()50。26548245743669c。perimeterNoticelackof()25。132741228718345
  尽管properties可以实现优雅的编程接口,但有些时候你还是会想直接使用getter和setter函数。例如:pPerson(Guido)p。getfirstname()Guidop。setfirstname(Larry)
  这种情况的出现通常是因为Python代码被集成到一个大型基础平台架构或程序中。例如,有可能是一个Python类准备加入到一个基于远程过程调用的大型分布式系统中。这种情况下,直接使用getset方法(普通方法调用)而不是property或许会更容易兼容。最后一点,不要像下面这样写有大量重复代码的property定义:classPerson:definit(self,firstname,lastname):self。firstnamefirstnameself。lastnamelastnamepropertydeffirstname(self):returnself。firstnamefirstname。setterdeffirstname(self,value):ifnotisinstance(value,str):raiseTypeError(Expectedastring)self。firstnamevalueRepeatedpropertycode,butforadifferentname(bad!)propertydeflastname(self):returnself。lastnamelastname。setterdeflastname(self,value):ifnotisinstance(value,str):raiseTypeError(Expectedastring)self。lastnamevalue
  重复代码会导致臃肿、易出错和丑陋的程序。好消息是,通过使用装饰器或闭包,有很多种更好的方法来完成同样的事情。

75岁郑少秋老了也有气质西服混搭大衣配围巾,一头黑发精神好有的人年龄不大,但已经很显老了;有的人年纪大了,反而显得更年轻,为什么会形成这样的反差呢?时间对于每个人都是公平的,苍老是不可避免的,只是有的人心态年轻,气质出众,并且懂……洗地机值得买吗?必胜2767Z洗地机使用体验分享洗地机是冲动消费吗?你有没有这样子的经历?每次被新的电子产品种草或者被网红产品宣传片说服后,内心总有个声音告诉自己,这款产品就是最适合自己的或者说是我有这样子的需求?……暗夜中点灯的人致那些看不到光明,却依旧在追寻黎明的英雄。这次的夜那么深邃,那么漫长无论点灯的人怎么努力黑暗始终不肯退去它缠绵于人间从草木丰盛的夏日到……芯片堆叠能弯道超车?你14nm堆叠,别人3nm堆叠,谁厉害?去年有媒体曝光了华为的芯片堆叠专利图,于是很多人表示,用两颗工艺相对成熟一点的芯片堆叠后,可以媲美一颗先进工艺的芯片,比如两颗14nm芯片堆叠,或许能媲美一颗7nm芯片。……四川两家市级统一法人农商行正式揭牌!农村信用社改革不断深化每经记者:刘嘉魁每经编辑:马子卿2022年,农村信用社改革成为热点话题,农信机构组建市级农商行的步伐也明显加快。临近年末,四川省乐山市、巴中市两家农商银行市级统一法人相继……赛季首次连胜!湖人2胜5负超篮网,但仍排在西部倒数第三经历一个加时,湖人今天以120117险胜鹈鹕,拿到本赛季首次连胜。在拿到两连胜之后,湖人战绩也来到了2胜5负,而篮网目前战绩只有2胜6负,还不如湖人,他们也还没有连胜过。……临近中秋佳节,分享10道待客菜,简单易做,学会了给家人露一手大家好,这里是小慧今天说美食,还有几天就到了我们一年一度的中秋节了,也就是在八月十五号这一天,小慧的家乡有吃月饼和赏月的习俗,当然不同地区,也有独特的风俗文化,中秋佳节我们都会……有一种智慧,叫学会转弯!山重水复疑无路,柳暗花明又一村。有些时候不是我们看得风景不够好,而是我们站的位置不对。人生路上,学会转弯,是一种顶级的智慧。思维转弯,道路就宽了《闲情偶……独家李子柒即将复出,与微念继续合作在这场分蛋糕的宴席上,主角李子柒不再是局外人。文《中国企业家》记者邓双琳编辑李薇头图来源李子柒微博停更531天后,李子柒与微念的交战终于迎来大结局。……湖南到2025年全省旅游总收入达到1。1万亿元以上中新网9月9日电据湖南省人民政府网站9日消息,湖南省委省政府近日出台《关于加快建设世界旅游目的地的意见》,发展目标明确,到2025年,全省旅游总收入达到1。1万亿元以上,接待游……情侣必打卡的网红景区观音山,国庆假期浪漫又甜蜜国庆节,肯定要带着心爱的TA一起去旅行呀既能培养感情又能留下美好的回忆确实一大难题那么,小编就为大家推荐一个两全其美的网红景区吧姻缘福……降压药饭前吃还是饭后吃?5个用药误区要搞清楚,否则可能白吃根据数据统计显示我国现有高血压患者2。7亿,而且这个数字越来越趋于年轻化,如此庞大的患者人群,让高血压防控压力山大。对于高血压患者来说,坚持长期规律服用降压药,可有效控制……
冬天多吃这蒸菜,好吃不上火,简单一蒸,出锅家人抢着吃导语:冬天多吃这蒸菜,好吃不上火,蒸一蒸就好,少闻油烟更健康,出锅家人抢着吃!大家好,我是傻姐美食,生活中唯有美食和美景不可辜负。冬天到了,都喜欢吃一些热乎乎的饭菜,不仅……换张SIM卡,就能两分钟破解安卓锁屏?你敢相信吗?不用指纹,不用人脸,也不用锁屏密码,只要换张SIM卡就能两分钟破解安卓锁屏,你敢相信吗?一位匈牙利的研究员DavidSchtz声称,他发现了一个谷歌Pixel手机的漏洞,……这一站,是宁德濂坑村千年古村,值得专程打卡的宁德古村落小红书:拍拍宁德的小孑(感谢大佬提供的摄影美图,图片授权使用)随着气温逐渐下降又到了游山玩水的好时候但不想远行又想出门浪怎么办?要带你们来逛逛藏在……投影仪家用新选择,峰米S5,更小,更强的实力派近年来,投影仪热度持续火爆,用投影仪打造家庭影院愈发流行,选择一台投影仪家用款也成为了越来越多年轻人创建家庭影院的主要目标。随着投影仪逐渐家用化,也带动了投影仪市场的内驱……三个草根一台戏草帽姐和朱之文同台演出,网友虾兵蟹将许多农村歌手都是认识的,草帽姐和朱之文同台演出了,视频中的草帽姐徐桂花热情地对着手机打招呼,而朱之文就穿着一件红色的礼服外套,后面坐着一个不太著名的歌手,可谓是三个草根一台戏了……合创汽车自驾出行好伙伴说实话,出去游玩跟团说是省心省钱,可真是累啊,一点也没有休闲的感觉。跟着团跑,简直是把我多少年没做的运动量全给耗出去了,一到晚上,别说在景点的照片什么了,就感觉是又累又饿,腿脚……外媒苹果正在开发用于iPhone的搜索引擎来源:环球网【环球网科技综合报道】11月15日消息,据外媒报道,苹果正在秘密研发用于iPhone的搜索引擎,以此与谷歌展开正面竞争。据悉,此前谷歌每年需向苹果支付约……火箭四少7522,伊森风头盖过巴恩斯,小马丁留下吧,马勒东可训练拼到受伤,老同志要注意保养身体,牙疼不是病疼起来要人命,史密斯、戈登和森贡都缺席比赛。对了,火箭还让了一个主教练,塞拉斯还是没能解除健康和安全协议。多名首发球员休战,……娱圈第一女流氓三救林志玲,王菲那英的靠山,宽姐有多绝?文2号探秘人编辑2号探秘人她曾经三救林志玲,被黄晓明视为亲姐姐,一手捧红了天后王菲,脾气火爆的那英对她也是毕恭毕敬。她整日一身黑衣,言语粗鄙,一年四季都穿着拖……试吃幼儿餐关注幼儿健康视频加载中。。。近日,常家学区中心幼儿园开展了家长委员会试吃幼儿餐点活动。膳食委员会成员严格按照疫情防控措施有序进入校园。园区老师从厨卫环境、安全管理、膳食管理及膳食搭配……iOS16值不值得更新,看这几个功能你喜不喜欢xdm,千呼万唤,iOS16正式版终于来了。相信很多小伙伴还在纠结到底要不要升级。升级后有哪些好用的功能,会不会遇到大家说的手机卡,耗电快的问题。别急,世超今……殡仪师披露玛丽莲梦露的心酸细节下葬前曾为她穿衣服一想起玛丽莲梦露,不少人脑海里都会自动浮现这样的一个形象:一头金色的微卷短发,曼妙妖娆的身姿,身着一袭白裙,地下管道的热气将她的裙摆吹成一只喇叭花,然后她弯腰昂头捂住裙子的性感……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网