簡體   English   中英

在python中組織類和模塊

[英]organising classes and modules in python

我試圖弄清楚如何組織模塊和類,我有點頭疼。 來自C ++,我習慣於封裝處理該數據所需的所有數據和方法的類。 在python中有一些模塊,但是從我看過的代碼中,有些人將大量松散的函數存儲在模塊中,而其他人幾乎總是將它們的函數綁定到類作為方法。

例如,假設我有一個數據結構,並希望將其寫入磁盤。

一種方法是為該對象實現一個save方法,以便我可以輸入

MyObject.save(filename)

或類似的東西。 我在同等比例看到的另一種方法是有類似的東西

from myutils import readwrite

readwrite.save(MyObject,filename)

這是一個小例子,我不確定python是如何具體解決這個問題的,但我的一般問題是在函數與方法組織方面最好的pythonic實踐是什么?

好像松散的功能打擾你。 這是python的方式。 這是有道理的,因為python中的模塊實際上只是與任何其他對象在同一基礎上的對象。 它確實有語言級支持從文件加載它,但除此之外,它只是一個對象。

所以,如果我有一個模塊foo.py

import pprint

def show(obj):
    pprint(obj)

然后我從bar.py導入它

import foo

class fubar(object):
   #code

   def method(self, obj):
       #more stuff
       foo.show(obj)

我本質上是訪問foo對象的方法。 foo模塊的數據屬性只是foo中定義的全局變量。 模塊是單例的語言級實現,無需將self到每個方法參數列表中。

我嘗試編寫盡可能多的模塊級函數。 如果某個函數只能用於特定類的實例,我會在類上創建一個方法。 否則,我嘗試使它適用於模塊中定義的每個類的實例,它將是有意義的。

您給出的確切示例背后的理性是,如果每個類都有一個save方法,那么如果您以后更改了保存數據的方式(從文件系統到數據庫或遠程XML文件),那么您必須更改每個類。 如果每個類實現一個接口來產生它想要保存的數據,那么你可以編寫一個函數來保存每個類的實例,並且只更改一次該函數。 這被稱為單一責任原則:每個類應該只有一個改變的理由。

如果你想要保存到磁盤的常規舊類,我只是將它作為實例方法。 如果它是一個可以處理不同類型對象的序列化庫,我會采取第二種方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM