您好,登錄后才能下訂單哦!
這篇文章主要介紹python中面向對象的使用限制有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
1、云計算,典型應用OpenStack。2、WEB前端開發,眾多大型網站均為Python開發。3.人工智能應用,基于大數據分析和深度學習而發展出來的人工智能本質上已經無法離開python。4、系統運維工程項目,自動化運維的標配就是python+Django/flask。5、金融理財分析,量化交易,金融分析。6、大數據分析。
1、不需要使用面向對象。
舉個例子,例如下面的代碼根本不需要使用面向對象。
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")
我們在這里使用了面向對象,因為我們想把root_url綁定到某個對象,我們不想每次都傳遞sessionmaker。我們還想使用繼承,在調用的途中訪問一種方法。
但是,只有數據傳輸和函數才能實現嗎?
@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")
必須隨時傳達Client和session_cls。
但是有什么關系呢?代碼量甚至減少了10%。這樣寫出來的代碼很容易理解,不需要使用對象。
有人管理這種寫法叫做函數袋。也就是說,整個代碼由有類型的數據和很多模塊作用域的函數構成。
那么,全局變量如何處理呢?您可以參考本文(https://leontrolski.github.io/sane-config.html),在整個應用程序的生命周期內重用config或db的session。
界面、抽象類怎么辦?其實你不需要它們,直接寫代碼就可以了。從平心來看,Python有類型標記后,函數袋的風格開始發揮真正的魅力。
不純粹的函數怎么辦?
如果您想使用純函數編程,您可能想編寫純類別,然后使用不純的適配器例子進行一些處理:getting-the-curent-datetime/API-calls/talking-to-the-db/other-impure-stuff。這個想法很好。事實上,你可以直接使用freezegun、responses等方法來避免大量的麻煩。
2、例外。
但是,也有例外的情況
你可能注意到,重構的代碼中加入了@dataclass,它們只是記錄類型。Python3可直接支持這些,無需使用套路類。
使用Exception的子類沒問題。使用try:..exceptSomeClass:..基本上形成層次,但沒關系。不要太復雜。
Enum和上面一樣,非常適合Python。
在極其罕見的情況下(至少在應用程序開發中很少見),你可能會想到一種非常有用的類型,然后到處使用ndas.DataFrame/sqlalchemy.Session一樣。但一般來說,不要欺騙自己,也不要欺騙自己,說我們正在建立一個偉大的應用程序。謙虛使人進步。
3、面向對象的弊端。
在這篇文章的開頭,我說對方本身沒有什么問題,其實對方不僅沒有幫助,還經常混淆問題,鼓勵不好的做法
鼓勵對方修改數據。函數非常反對修改參數。如果你不相信,你可以試試,但不要生氣。
面向對象只是回歸的全局變量。無法在函數之間共享數據。self強制使用更小的狀態空間制作容易測試的函數。
混合數據和函數會加劇序列化的難度,而在當今RESTAPI流行的情況下,序列化是非常有用的。
面向對象帶來瘋狂的繼承體系統,關于這個話題的討論遍地都是。
以上是“python中面向對象的使用限制有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。