没想到啊,Python类还可以这样写,简洁又强大
作者:麦叔
来源:麦叔编程回顾和问题
上一篇文章,我们讲解了NamedTuple。它可以让我们像使用对象一样使用元组,避免魔术数字,让代码更安全,更易于理解,也比普通对象更快。
下面是其中的例子。有兴趣的麦友可以在合集中往前翻,找到上一篇文章。fromtypingimportNamedTupleclassStock(NamedTuple):name:strhigh:floatlow:floatend:floatstock1Stock(苹果,100,80,88)stock2Stock(name百度,high80,low63,end65)print(stock2。high)print(stock2。low)print(stock2。end)
但命名元组有个问题。它的数据是不能修改的,这是元组的重要特点。
那如果我的对象需要修改,怎么办呢?这就是本文的重点!使用dataclass
从Python3。7开始,我们可以用很简洁的语法定义只有属性的类,也就是dataclass。从表面上看,它们非常像命名元组。
下面是dataclass版本的Stock:fromdataclassesimportdataclassdataclassclassStock:symbol:strcurrent:floathigh:floatlow:float
这个例子中,它的定义几乎和NamedTuple定义完全相同。
dataclass函数是一个类装饰器,使用符号。dataclass包含状态且可以被修改,重要的是它的功能很强大。
下面是创建Stock实例的例子:sStock(AAPL,123。52,137。98,53。15)
一旦实例化,Stock对象可以像普通类一样使用。你可以访问和更新它的属性:sStock(symbolAAPL,current123。52,high137。98,low53。15)s。current123。52s。current122。25sStock(symbolAAPL,current122。25,high137。98,low53。15)优点多多
我们来看看,dataclass相比普通的类有什么优点。
下面是一个功能类似的普通类:classStockOrdinary:definit(self,name:str,current:float,high:float,low:float)None:self。namenameself。currentcurrentself。highhighself。lowlowsordStockOrdinary(AAPL,123。52,137。98,53。15)
好处1:dataclass只需要写一次属性名,不需要在init()方法的参数和方法体中重复。
好处2:dataclass也提供了一个比object类更加友好的字符串表达。
好处3:dataclass也包含相等比较运算。
下面的例子可以比较普通类和dataclass的区别:sordmain。StockOrdinaryobjectat0x7fb833c63f10sord2StockOrdinary(AAPL,123。52,137。98,53。15)sordsord2False
普通类的默认字符串表达看起来很糟糕,而且它没有相等运算。dataclass的情况就要好多了:stock2Stock(symbolAAPL,current122。25,high137。98,low53。15)sstock2True
好处4:你可以为属性指定默认值。
也许股票市场闭市了,你不知道今天股票的价格是什么:dataclassclassStockDefaults:name:strcurrent:float0。0high:float0。0low:float0。0
你可以只用股票名称来创建对象。其他的值会使用默认值:StockDefaults(GOOG)StockDefaults(nameGOOG,current0。0,high0。0,low0。0)
好处5:你可以轻松的添加比较运算,如下所示:dataclass(orderTrue)classStockOrdered:name:strcurrent:float0。0high:float0。0low:float0。0
你也许会问:就这么简单?
是的!给装饰器添加orderTrue参数,就会创建所有的比较运算方法。这使得我们可以比较对象实例,也可以排序。就像下面这样:stockordered1StockOrdered(GOOG,1826。77,1847。20,1013。54)stockordered2StockOrdered(GOOG)stockordered3StockOrdered(GOOG,1728。28,high1733。18,low1666。33)stockordered1stockordered2Falsestockordered1stockordered2Truefrompprintimportpprintpprint(sorted(〔stockordered1,stockordered2,stockordered3〕))〔StockOrdered(nameGOOG,current0。0,high0。0,low0。0),StockOrdered(nameGOOG,current1728。28,high1733。18,low1666。33),StockOrdered(nameGOOG,current1826。77,high1847。2,low1013。54)〕麦叔寄语
下次创建类的时候,试试看dataclass,写很少的代码就有很强大的功能。
dataclass也可以像普通类一样,添加所需要的实例方法或类方法。
布朗4112塔图姆3110麦科勒姆38分绿军力克鹈鹕四连胜直播吧1月12日讯今日NBA常规赛凯尔特人主场迎战鹈鹕,此前绿军已经取得三连胜,29胜12负稳居联盟第一,鹈鹕则是以25胜16负位列西部第三。本场锡安继续缺阵,斯玛特和罗威也将缺席
花钱越多成绩越差,9号位魔咒吞噬切尔西联赛中还能坚守60分钟,转战足总杯后便一溃千里,切尔西在两战曼城的过程中丢尽颜面。波特与新东家的蜜月恍如隔日,排山倒海的指责声已经令他应接不暇。两年前还站在欧冠之巅,一年前尚能领跑
再见马竞!西蒙尼或离任,有望接手9。15亿豪门据西班牙六台记者记者PacoGarcaCaridad报道,马竞主帅西蒙尼已经告知了马竞CEO吉尔马林,他将在今年夏天离任!作为马竞的功勋主帅西蒙尼率领球队两次拿下了西甲联赛冠军,只
曼城止步联赛杯八强新华社伦敦1月11日电(记者张薇)英超卫冕冠军曼城11日在英格兰联赛杯四分之一决赛中客场02不敌南安普敦,无缘半决赛。图源曼城俱乐部官网多线作战的曼城本周末就将在英超赛场迎来同城大
追光丨普莱西德湖,重回那个梦开始的地方普莱西德湖一个对中国冰雪人来说并不陌生的名字43年前第一代新中国冰雪人在普莱西德湖启航新中国恢复在国际奥委会合法席位后中国体育代表团首次参加冬奥会也是新中国历史上首次参加奥运会19
有火山口的地方,就有宝石,你相信吗?中国几乎每个省份都有火山口。看看在你的家乡那里能找到什么宝石?第一,蓝宝石,两万一克拉的蓝宝石,在这儿随手就能捡到十克拉。山东的昌乐曾经是由几十座火山群围绕着,喷发周围的450平方
南京旅游必玩的两个地方南京是著名的六朝古都,国家历史文化名城,这里自然风光优美,文化底蕴深厚,自古就有江南佳丽地,金陵帝王州的美誉。作为一个在南京工作生活了二十多年的人,南京所有的景区都去玩过,有的还去
12岁孩子一天到晚闭门上网课?其实他在用手机打游戏来源中国经济网汤大姐的儿子12岁,这段时间孩子经常在屋里,从早到晚的上网课。唐大姐纳闷,这网课怎么还24小时不停歇了呢?汤大姐育有一儿一女,女儿已经成家,儿子小明今年12岁,跟汤大
一周茶播报丨2022年国家农产品质量安全例行监测茶叶合格率为98编者按信息互通,纵观茶天下。红网茶频道每周为您总结整理最新茶行业动态。想了解行业最新消息,掌握行业风向标吗?来看红网茶频道带来的一周茶播报。事件一2022年国家农产品质量安全例行监
泰顺廊桥氡泉旅游度假区获批升格国家级1月10日,泰顺廊桥氡泉旅游度假区获文化和旅游部批复认定为国家级旅游度假区。这也是浙南闽东首个国家级旅游度假区。氡泉大峡谷全景。国家级旅游度假区是继5A级旅游景区之后又一个体现我国
小米再上央视,雷军这个字用的漂亮此前曾有媒体汇总过2022年智能手机领域出现的黑科技,小米有三项技术进入。分别是与索尼共同研发一英寸大底传感器与徕卡达成合作全球首个商用210W快充。在这些技术的背后是小米研发的投