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

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

類設計:優雅地初始化和更新實例變量

類設計:優雅地初始化和更新實例變量

慕沐林林 2022-10-18 17:07:52
有時我想編寫一個帶有實例變量的類,它一方面應該在內部初始化__init__,但另一方面也可以在某些事件發生后從內部或從外部通過不同的函數 ( function_1- ) 進行更新。function_3更新函數都依賴于相同的輸入參數,但在初始化和以后的更新中工作相同。它們可能是類的成員(@staticmethod或不是),也可能是從某個包導入的實用函數。對于以后的更新,“元”更新函數(update_member_variables)顯然應該是一個過程,即什么都不返回,只修改成員變量作為副作用。但是,對于初始化,它最好是一個純函數并返回變量的值,以便可以將它們分配給內部的變量__init__。這種沖突總是讓我經歷以下重復代碼、外部聲明__init__和None初始化的循環,但從未導致令人滿意的解決方案:from some_utils import function_1, function_2, function_3# A: duplicate code in update_member_variablesclass Class:    def __init__(self, parameter):        self._variable_1 = function_1(parameter)        self._variable_2 = function_2(parameter)        self._variable_3 = function_3(parameter)    def update_member_variables(self, parameter):        self._variable_1 = function_1(parameter)        self._variable_2 = function_2(parameter)        self._variable_3 = function_3(parameter)# B: instance variables declared outside __init__class Class:    def __init__(self, parameter):        self.update_member_variables(parameter)    def update_member_variables(self, parameter):        self._variable_1 = function_1(parameter)        self._variable_2 = function_2(parameter)        self._variable_3 = function_3(parameter)# C: boilerplate None-assignmentsclass Class:    def __init__(self, parameter):        self._variable_1 = None        self._variable_2 = None        self._variable_3 = None        self.update_member_variables(parameter)    def update_member_variables(self, parameter):        self._variable_1 = function_1(parameter)        self._variable_2 = function_2(parameter)        self._variable_3 = function_3(parameter)選擇 B 很誘人,但由于對 之外的成員變量聲明的所有警告__init__,我通常堅持使用 C 或 D,盡管它們看起來臃腫而笨重。沒有更好的方法來解決這種情況嗎?也許在盒子外面?還是 AD 中最“優雅”或最干凈的一款?相關問題:在https://stackoverflow.com/a/51607441/3863847中回答了類似的問題,但update_number僅適用于初始化。接受的答案的代碼就像我的 D,但沒有update_member_variables.在https://stackoverflow.com/a/20661498/3863847中回答了另一個相關問題。一般來說,Simeon Visser 指出,在初始化后確保對象一致是開發人員的責任,但無論如何,嚴格遵守該規則并不是必須的。我的情況是可以選B的情況嗎?B 的實例化對象至少是一致的。
查看完整描述

2 回答

?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

class A:

    def __init__(self, parameter):

        self._variable_1 = function_1(parameter)

        self._variable_2 = function_2(parameter)

        self._variable_3 = function_3(parameter)


    @property

    def variable_1(self):

        return self._variable_1


    @variable_1.setter

    def variable_1(self, value):

        self._variable_1 = function_1(value)


    ... so on and so forth for other variables ...


 a = A(parameter1)

 # update based on parameters

 a.variable_1 = parameter2

我覺得使用屬性可以更好地更新變量。


查看完整回答
反對 回復 2022-10-18
?
ITMISS

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

https://stackoverflow.com/a/19292653/3863847中,sthenault 給出了可讀性作為不應在外部聲明實例變量的原因__init__。

據我所知,這植根于 PEP 8,這就是 pylint 抱怨違規行為的原因——我從不選擇 B。

sthenault 還建議在 中進行無分配__init__,就像 progmatico 在我的問題下方的評論中所做的那樣,這對應于我的版本 C。

盡管我希望有一個優雅的技巧以某種方式規避這種情況,但我暫時將 C 視為“最 Pythonic”。如果以后有人想出我正在尋找的這種神奇的解決方案,我將切換接受的答案。


查看完整回答
反對 回復 2022-10-18
  • 2 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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