我認為標題給出了我正在尋找的內容的總體思路,但更具體地說,我將給出一個帶有代碼的示例。
因此,假設我有一個 Python 類,其中包含一些必需的位置變數,這些變數也接受任意數量的關鍵字引數。該類有許多資料成員,其中一些將由所需的位置變數定義,但大多數是關鍵字引數變數,其中程式對這些變數具有默認值,但如果用戶使用關鍵字引數,這將覆寫默認值。我正在尋找最“pythonic”的方式來初始化這種型別的類。我有兩個關于如何做到這一點的想法,但他們每個人都感到不滿意,就像我缺少一種更 Pythonic 的方式。
#First Option
class SampleOne:
def __init__(pos1, pos2, **kwargs):
def do_defaults():
self.kwarg1 = default_kwarg1
self.kwarg2 = default_kwarg2
self.kwarg3 = default_kwarg3
def do_given():
for variable, value in kwargs.items():
self.variable = value
self.pos1 = pos1
self.pos2 = pos2
do_defaults()
do_given()
或者
#Second Option
class SampleTwo:
def __init__(pos1, pos2, **kwargs):
self.pos1 = pos1
self.pos2 = pos2
self.kwarg1 = kwargs[kwarg1] if kwarg1 in kwargs else default_kwarg1
self.kwarg2 = kwargs[kwarg2] if kwarg2 in kwargs else default_kwarg2
self.kwarg3 = kwargs[kwarg3] if kwarg3 in kwargs else default_kwarg3
我不喜歡第一個選項,因為如果要更改一組默認資料成員,則設定一組默認資料成員似乎很浪費,尤其是在有很多資料成員的情況下。
我不喜歡第二個選項,因為在我看來它看起來不必要地忙碌且可讀性較差 - 我喜歡將默認值與用戶定義的值分開,并認為這將使我的代碼更易于閱讀和更改。
此外,我使用 **kwargs 而不是帶有默認值的關鍵字引數,因為我仍處于此代碼庫開發的早期階段,因此所需的成員變數可能會發生變化,但也因為將有很多成員變數,擁有所有這些引數會使函式簽名變得非常難看。
抱歉,如果我的問題有點啰嗦,這是我第一次在 StackOverflow 上提問,我想確保我提供了足夠的細節。
此外,如果它有所不同,我的代碼需要在 Python 3.8 及更高版本中作業。
uj5u.com熱心網友回復:
指定您想要支持的默認值,并采用不需要默認值的任意值。這使您的類保持可讀性和實作(相對)清晰:
class Sample:
def __init__(
self,
pos1,
pos2,
kwarg1='default_1',
kwarg2='default_2',
kwarg3='default_3',
**kwargs
):
self.pos1 = pos1
self.pos2 = pos2
self.kwarg1 = kwarg1
self.kwarg2 = kwarg2
self.kwarg3 = kwarg3
for k, v in kwargs.items():
setattr(self, k, v)
uj5u.com熱心網友回復:
這是一種可能的解決方案:
class Solution:
def __init__(self, pos1, pos2, **kwargs):
self.pos1 = pos1
self.pos2 = pos2
for key, value in kwargs.items():
if key not in self.__dict__:
self.__dict__[key] = value
else:
raise ValueError(f"{key} already exists in Solution")
您需要注意不要覆寫類中的方法或現有變數,因此我讓它拋出例外,以防您嘗試這樣做。
用法示例:
>>> solution = Solution(1, 2, kwarg1=1, kwarg2=2, kwarg3=3, kwarg4=4)
>>> print(solution.__dict__)
{'pos1': 1, 'pos2': 2, 'kwarg1': 1, 'kwarg2': 2, 'kwarg3': 3, 'kwarg4': 4}
>>> solution.kwarg4
4
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/391717.html
