99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀沒想到啊,Python類還可以這樣寫,簡潔又強大
沒想到啊,Python類還可以這樣寫,簡潔又強大
2022-08-26
收藏

作者:麥叔

來源:麥叔編程


回顧和問題

上一篇文章,我們講解了NamedTuple。它可以讓我們像使用對象一樣使用元組,避免魔術(shù)數(shù)字,讓代碼更安全,更易于理解,也比普通對象更快。

下面是其中的例子。有興趣的麥友可以在合集中往前翻,找到上一篇文章。

from typing import NamedTuple class Stock(NamedTuple): name: str
    high: float
    low: float
    end: float

stock1 = Stock('蘋果', 100, 80, 88)
stock2 = Stock(name='百度', high=80, low=63, end=65)

print(stock2.high)
print(stock2.low)
print(stock2.end)

但命名元組有個問題。它的數(shù)據(jù)是不能修改的,這是元組的重要特點。

那如果我的對象需要修改,怎么辦呢?這就是本文的重點!

使用dataclass

從Python3.7開始,我們可以用很簡潔的語法定義只有屬性的類,也就是dataclass。從表面上看,它們非常像命名元組。

下面是dataclass版本的Stock:

from dataclasses import dataclass
@dataclass class Stock: symbol: str
    current: float high: float low: float 

這個例子中,它的定義幾乎和NamedTuple定義完全相同。

dataclass函數(shù)是一個類裝飾器,使用@符號。dataclass 包含狀態(tài)且可以被修改,重要的是它的功能很強大。

下面是創(chuàng)建Stock實例的例子:

>>> s = Stock("AAPL", 123.52, 137.98, 53.15)

一旦實例化,Stock對象可以像普通類一樣使用。你可以訪問和更新它的屬性:

>>> s
Stock(symbol='AAPL', current=123.52, high=137.98, low=53.15) >>> s.current 123.52 >>> s.current = 122.25 >>> s
Stock(symbol='AAPL', current=122.25, high=137.98, low=53.15)

優(yōu)點多多

我們來看看,dataclass相比普通的類有什么優(yōu)點。

下面是一個功能類似的普通類:

class StockOrdinary: def __init__(self, name: str, current: float, high: float, low: float) -> None: self.name = name self.current = current self.high = high self.low = low
s_ord = StockOrdinary("AAPL", 123.52, 137.98, 53.15)

「好處1」:dataclass只需要寫一次屬性名,不需要在__init__()方法的參數(shù)和方法體中重復。

「好處2」:dataclass也提供了一個比object類更加友好的字符串表達。

「好處3」:dataclass也包含相等比較運算。

下面的例子可以比較普通類和dataclass的區(qū)別:

>>> s_ord
<__main__.StockOrdinary object at 0x7fb833c63f10> >>> s_ord_2 = StockOrdinary("AAPL", 123.52, 137.98, 53.15) >>> s_ord == s_ord_2
False

普通類的默認字符串表達看起來很糟糕,而且它沒有相等運算。dataclass的情況就要好多了:

>>> stock2 = Stock(symbol='AAPL', current=122.25, high=137.98, low=53.15) >>> s == stock2
True

「好處4」:你可以為屬性指定默認值。

也許股票市場閉市了,你不知道今天股票的價格是什么:

@dataclass class StockDefaults: name: str current: float = 0.0 high: float = 0.0 low: float = 0.0 

你可以只用股票名稱來創(chuàng)建對象。其他的值會使用默認值:

>>> StockDefaults("GOOG") StockDefaults(name='GOOG', current=0.0, high=0.0, low=0.0)

「好處5」:你可以輕松的添加比較運算,如下所示:

@dataclass(order=True) class StockOrdered: name: str current: float = 0.0 high: float = 0.0 low: float = 0.0 

你也許會問:就這么簡單?

是的!給裝飾器添加order=True參數(shù),就會創(chuàng)建所有的比較運算方法。這使得我們可以比較對象實例,也可以排序。就像下面這樣:

>>> stock_ordered1 = StockOrdered("GOOG", 1826.77, 1847.20, 1013.54) >>> stock_ordered2 = StockOrdered("GOOG") >>> stock_ordered3 = StockOrdered("GOOG", 1728.28, high=1733.18, 
low=1666.33) >>> stock_ordered1 < stock_ordered2
False >>> stock_ordered1 > stock_ordered2
True >>> from pprint import pprint >>> pprint(sorted([stock_ordered1, stock_ordered2, stock_ordered3]))
[StockOrdered(name='GOOG', current=0.0, high=0.0, low=0.0),
 StockOrdered(name='GOOG', current=1728.28, high=1733.18, low=1666.33),
 StockOrdered(name='GOOG', current=1826.77, high=1847.2, low=1013.54)]

麥叔寄語

下次創(chuàng)建類的時候,試試看 @dataclass,寫很少的代碼就有很強大的功能。

dataclass也可以像普通類一樣,添加所需要的實例方法或類方法。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }