根據通過 cli 引數傳入的輸入,實作類屬性發生變化的最佳方法是什么?
我寫的東西非常好,但是感覺過于凌亂和糟糕的設計。有沒有更好的方法來解決這個問題?
下面的例子有四個不同的輸入,但是隨著這個程式變大并支持潛在的幾十個引數值,這將變得非常混亂。
這是一些簡短的示例代碼;
class Machine(object):
def __init__(self, name):
self.name = name
self.ip = None
self.subnet = None
self.mac = None
if name == 'win':
self.ip = '1.2.3.4'
self.subnet = '1.2.3.4'
self.mac = 'randommacaddress'
elif name == 'lin':
self.ip = '4.5.6.7'
self.subnet = '4.5.6.7'
self.mac = 'randommacaddress'
elif name == 'macos':
self.ip = '6.7.8.9'
self.subnet = '6.7.8.9'
self.mac = 'randommacaddress'
def main()
parser = argparse.ArgumentParser()
parser.add_argument('input')
args = parser.parse_args()
machine = Machine(args.input)
帶引數呼叫的示例;
python main.py win
uj5u.com熱心網友回復:
不知道是否是最佳選擇,但假設實際值'foo1' 'foo2'只是其他或更復雜的東西,我會去更新 self. 字典
兩種方式(我覺得第二種更清楚)
class A():
def __init__(self,var1):
self.var1 = var1
fooDict = {'var2':'foo2','var3':'foo3','var4':'foo4'}
foovarDict = {'var2':'foovar2','var3':'foovar3','var4':'foovar4'}
if var1 == 'foo':
self.__dict__ = {**self.__dict__,**fooDict}
elif var1 == 'foovar':
self.__dict__ = {**self.__dict__,**foovarDict}
def getVars(self):
print(self.var1)
print(self.var2)
print(self.var3)
print(self.var4)
a = A('foo')
a.getVars()
#ouputs
#foo
#foo2
#foo3
#foo4
b = A('foovar')
b.getVars()
#outputs
#foovar
#foovar2
#foovar3
#foovar4
第二種方式:
class A():
def __init__(self,var1):
self.var1 = var1
fooDict = {'var2':'foo2','var3':'foo3','var4':'foo4'}
foovarDict = {'var2':'foovar2','var3':'foovar3','var4':'foovar4'}
if var1 == 'foo':
self.__dict__.update(fooDict)
elif var1 == 'foovar':
self.__dict__.update(foovarDict)
def getVars(self):
print(self.var1)
print(self.var2)
print(self.var3)
print(self.var4)
a = A('foo')
a.getVars()
b = A('foovar')
b.getVars()
具有相同的輸出
uj5u.com熱心網友回復:
正如評論中所建議的,有很多方法可以清理它。對于你的例子的大小和規模,我會做這樣的事情:
class Example:
_DEPENDENT_VALS = {
'foo': ('foo2', 'foo3', 'foo4'),
'bar': ('bar2', 'bar3', 'bar4'),
'foobar': ('foobar2', 'foobar3', 'foobar4'),
'barfoo': ('barfoo2', 'barfoo3', 'barfoo4')
}
def __init__(self, var1):
self.var1 = var1
self.var2 = None
self.var3 = None
self.var4 = None
if var1 in Example._DEPENDENT_VALS:
self.var2, self.var3, self.var4 = Example._DEPENDENT_VALS[var1]
根據您設定的值的數量和型別,此方法可能并不總是合適的,但這是一種方法。
uj5u.com熱心網友回復:
` ls=['foo','bar','foobar','barfoo'] #添加前綴串列
如果 ls 中的 self.var1:
self.var2= f'{self.var1}2'
self.var3= f'{self.var1}3'
self.var4= f'{self.var1}4'
`
uj5u.com熱心網友回復:
定義一個dict映射前綴到tuple三個修飾符中的一個,然后使用它來初始化它們:
class Example:
_var_suffixes = {'foo': ('1', '2', '3'),
'bar': ('1', '2', '3'),
'foobar': ('1', '2', '3'),
'barfoo': ('1', '2', '3'),
}
def __init__(self, var1):
self.var1 = var1
self.var2 = None
self.var3 = None
self.var4 = None
if var1 in self._var_suffixes:
suf2, suf3, suf4 = self._var_suffixes[var1]
self.var2 = var1 suf2
self.var3 = var1 suf3
self.var4 = var1 suf4
或者,這可能更有意義,存盤var2通過var4作為list(特別是如果后綴的數量是關鍵變數),在這種情況下,你會做這樣的事情,這是更簡單:
class Example:
_var_suffixes = {'foo': ('1', '2'),
'bar': ('1', '2', '3'),
'foobar': ('1', '2', '3', '4'),
'barfoo': ('1', '2', '3', '4', '5'),
}
def __init__(self, var1):
self.var1 = var1
self.varlist = []
for suf in self._var_suffixes.get(var1, ()):
self.varlist.append(var1 suf)
# Optional property for access by name
@property
def var2(self):
try:
return self.varlist[0]
except IndexError:
return None
uj5u.com熱心網友回復:
類主體只是 Python 代碼。它有特定的范圍規則,但除此之外什么都沒有。這意味著您可以有條件地創建函式:
C類:if some_condition:def optional_method(self):從別處傳遞或拉取方法:
匯入 some_module
D 類:method_name = some_module.function_that_accepts_self 等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/331634.html
