亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將基于函數的數據管道轉換為 OOP?

如何將基于函數的數據管道轉換為 OOP?

慕森王 2023-09-12 17:28:29
我正在做一些數據處理,并構建了多個管道,每個管道都包含多個函數,這些函數在每個步驟中廣泛修改字典。由于不同的管道對相同的數據進行操作并具有相似的功能,因此我一直在嘗試將其轉換為更面向 OOP 的結構。然而,在我開始之前,我已經把自己稍微打結了。采取以下簡化示例:for f in foos:    y = extract_y_info(f)    z = extract_z_info(f)    *some code that does something with y and z*    def extract_y_info(f):    return *some code that extracts y info from f*def extract_z_info(f):    return *some code that extracts z info from f*對我來說,似乎有幾種方法可以將其轉移到 OOP 結構。第一個與逐個功能的方法非常相似。class foo():    def __init__(self, x):        self.x = x    def extract_y_info(self):        return *some code that extracts y info from self.x*    def extract_z_info(self):        return *some code that extracts z info from self.x*for f in foo_instances:    y = b.extract_y_info()    z = b.extract_z_info()    *some code that does something with y and z*另一個選項是修改類的實例:class foo():    def __init__(self, x):        self.x = x    def extract_y_info(self):        self.y = *some code that extracts y info from self.x*    def extract_z_info(self):        self.z = *some code that extracts z info from self.x*for f in foo_instances:    f.extract_y_info()    f.extract_z_info()    *some code that does something with f.y and f.z*這些選項中的任何一個是否比另一個更好?還有更好的第三種方法嗎?
查看完整描述

1 回答

?
青春有我

TA貢獻1784條經驗 獲得超8個贊

這實際上取決于您的總體設計是什么,以及您期望實例在任何給定時間處于什么狀態以及您對它的處理方式(換句話說,屬性本身的存在是否有意義,但是......前者似乎通常更y安全我。你調用并獲得一個值,你不必跟蹤,我是否調用了該方法以及這個或那個屬性處于什么狀態?但請注意,你應該真正在構造函數中定義實例屬性,否則訪問可能不僅令人驚訝,而且是致命的(AttributeError)。


現在,解決上述一些問題并且可能適合您在此處訪問值的操作的簡潔解決方案可能是 property ,它本質上允許您訪問方法返回的值,就好像它是實例屬性一樣:


class foo():

? ? def __init__(self, x):

? ? ? ? self.x = x


? ? def extract_y_info(self):

? ? ? ? return #some code that extracts y info from self.x


? ? y = property(extract_y_info)? ? ?


for f in foo_instances:

? ? print(f"value of f.y = {f.y}")

property或者您可以使用方法裝飾器執行相同的操作:


? ? @property

? ? def y(self):

? ? ? ? return #some code that extracts y info from self.x

如果獲取y成本昂貴且其值在實例的整個生命周期內不會改變,從 Python 3.8 開始,您還可以使用cached_property.



查看完整回答
反對 回復 2023-09-12
  • 1 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號