十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
這篇文章主要介紹python中面向?qū)ο蟮氖褂孟拗朴心男?,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
專業(yè)成都網(wǎng)站建設(shè)公司,做排名好的好網(wǎng)站,排在同行前面,為您帶來(lái)客戶和效益!創(chuàng)新互聯(lián)為您提供成都網(wǎng)站建設(shè),五站合一網(wǎng)站設(shè)計(jì)制作,服務(wù)好的網(wǎng)站設(shè)計(jì)公司,成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)負(fù)責(zé)任的成都網(wǎng)站制作公司!
1、云計(jì)算,典型應(yīng)用OpenStack。2、WEB前端開發(fā),眾多大型網(wǎng)站均為Python開發(fā)。3.人工智能應(yīng)用,基于大數(shù)據(jù)分析和深度學(xué)習(xí)而發(fā)展出來(lái)的人工智能本質(zhì)上已經(jīng)無(wú)法離開python。4、系統(tǒng)運(yùn)維工程項(xiàng)目,自動(dòng)化運(yùn)維的標(biāo)配就是python+Django/flask。5、金融理財(cái)分析,量化交易,金融分析。6、大數(shù)據(jù)分析。
1、不需要使用面向?qū)ο蟆?/strong>
舉個(gè)例子,例如下面的代碼根本不需要使用面向?qū)ο蟆?/p>
class ApiClient: def __init__(self, root_url: str, session_cls: sessionmaker): self.root_url = root_url self.session_cls = session_cls def construct_url(self, entity: str) -> str: returnf"{self.root_url}/v1/{entity}" def get_items(self,entity: str) -> List[Item]: resp = requests.get(self.construct_url(entity)) resp.raise_for_status() return [Item(**n) for n in resp.json()["items"]] def save_items(self, entity: str) -> None: with scoped_session(self.session_cls)as session: session.add(self.get_items(entity)) class ClientA(ApiClient): def construct_url(self, entity: str) -> str: returnf"{self.root_url}/{entity}" class ClientB(ApiClient): def construct_url(self, entity: str) -> str: returnf"{self.root_url}/a/special/place/{entity}" client_a = ClientA("https://client-a",session_cls) client_a.save_items("bars")
我們?cè)谶@里使用了面向?qū)ο螅驗(yàn)槲覀兿氚裷oot_url綁定到某個(gè)對(duì)象,我們不想每次都傳遞sessionmaker。我們還想使用繼承,在調(diào)用的途中訪問(wèn)一種方法。
但是,只有數(shù)據(jù)傳輸和函數(shù)才能實(shí)現(xiàn)嗎?
@dataclass class Client: root_url: str url_layout: str client_a = Client( root_url="https://client-a", url_layout="{root_url}/{entity}", ) client_b = Client( root_url="https://client-b", url_layout="{root_url}/a/special/place/{entity}", ) def construct_url(client: Client, entity: str) -> str: returnclient.url_layout.format(root_url=client.root_url, entity=entity) def get_items(client: Client, entity: str) -> List[Item]: resp = requests.get(construct_url(client, entity)) resp.raise_for_status() return [Item(**n) for n in resp.json()["items"]] def save_items(client: Client, session_cls: session_cls, entity: str) -> None: withscoped_session(session_cls) as session: session.add(get_items(client, entity)) save_items(client_a,session_cls, "bars")
必須隨時(shí)傳達(dá)Client和session_cls。
但是有什么關(guān)系呢?代碼量甚至減少了10%。這樣寫出來(lái)的代碼很容易理解,不需要使用對(duì)象。
有人管理這種寫法叫做函數(shù)袋。也就是說(shuō),整個(gè)代碼由有類型的數(shù)據(jù)和很多模塊作用域的函數(shù)構(gòu)成。
那么,全局變量如何處理呢?您可以參考本文(https://leontrolski.github.io/sane-config.html),在整個(gè)應(yīng)用程序的生命周期內(nèi)重用config或db的session。
界面、抽象類怎么辦?其實(shí)你不需要它們,直接寫代碼就可以了。從平心來(lái)看,Python有類型標(biāo)記后,函數(shù)袋的風(fēng)格開始發(fā)揮真正的魅力。
不純粹的函數(shù)怎么辦?
如果您想使用純函數(shù)編程,您可能想編寫純類別,然后使用不純的適配器例子進(jìn)行一些處理:getting-the-curent-datetime/API-calls/talking-to-the-db/other-impure-stuff。這個(gè)想法很好。事實(shí)上,你可以直接使用freezegun、responses等方法來(lái)避免大量的麻煩。
2、例外。
但是,也有例外的情況
你可能注意到,重構(gòu)的代碼中加入了@dataclass,它們只是記錄類型。Python3可直接支持這些,無(wú)需使用套路類。
使用Exception的子類沒問(wèn)題。使用try:..exceptSomeClass:..基本上形成層次,但沒關(guān)系。不要太復(fù)雜。
Enum和上面一樣,非常適合Python。
在極其罕見的情況下(至少在應(yīng)用程序開發(fā)中很少見),你可能會(huì)想到一種非常有用的類型,然后到處使用ndas.DataFrame/sqlalchemy.Session一樣。但一般來(lái)說(shuō),不要欺騙自己,也不要欺騙自己,說(shuō)我們正在建立一個(gè)偉大的應(yīng)用程序。謙虛使人進(jìn)步。
3、面向?qū)ο蟮谋锥恕?/p>
在這篇文章的開頭,我說(shuō)對(duì)方本身沒有什么問(wèn)題,其實(shí)對(duì)方不僅沒有幫助,還經(jīng)?;煜龁?wèn)題,鼓勵(lì)不好的做法
鼓勵(lì)對(duì)方修改數(shù)據(jù)。函數(shù)非常反對(duì)修改參數(shù)。如果你不相信,你可以試試,但不要生氣。
面向?qū)ο笾皇腔貧w的全局變量。無(wú)法在函數(shù)之間共享數(shù)據(jù)。self強(qiáng)制使用更小的狀態(tài)空間制作容易測(cè)試的函數(shù)。
混合數(shù)據(jù)和函數(shù)會(huì)加劇序列化的難度,而在當(dāng)今RESTAPI流行的情況下,序列化是非常有用的。
面向?qū)ο髱?lái)瘋狂的繼承體系統(tǒng),關(guān)于這個(gè)話題的討論遍地都是。
以上是“python中面向?qū)ο蟮氖褂孟拗朴心男边@篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!