一般來說
,是真正糟糕的一般建議,沒有參數的方法對於修改的對象在需要沒有外部數據,或功能,只有擁有全局交互的方式對象是大(你應該真的很少需要這樣做)。在你的情況下,你需要用外部數據修改給定的對象,並且這兩個對象都是內置類型(int
)。
在這種情況下,只需使用帶有兩個參數的函數即可。
參數太多
現在,這裏是哪裏的建議得到好。假設我需要做一個複雜的任務,有很多爭論。
def complicatedfunction(arg1, arg2, arg3, arg4, arg5, arg6):
'''This requires 6 pieces of info'''
return ((arg1 + arg2)/(arg3 * arg4)) ** (arg5 + arg6)
在這種情況下,你這是不可讀的代碼,您應該參數的數量減少到小於或等於5。
減少參數計數
在這種情況下,你可以通過一個namedtuple:
from collections import namedtuple
Numbers = namedtuple("Numbers", "numerator denominator exponent")
mynumber = Numbers(1+2, 3+4, 5+6)
def complicatedfunction(number):
return (number.numerator/number.denominator) ** (number.exponent)
這有那麼讓你的代碼很容易在未來修改的好處。假設我需要添加另一個參數:我可以將其作爲值添加到namedtuple中。
from collections import namedtuple
Numbers = namedtuple("Numbers", "numerator denominator exponent add")
mynumber = Numbers(1+2, 3+4, 5+6, 2)
def complicatedfunction(number):
value = (number.numerator/number.denominator) ** (number.exponent)
return value + number.add
面向對象設計
或者,如果我想使用特定namedtuple了很多不同的任務,我可以繼承它,然後得到一個0參數的方法,針對特定目標。我可以添加儘可能多的方法,因爲我想,這讓我使用對象通用的方式,具體如下:
from collections import namedtuple
class Numbers(namedtuple("Numbers", "numerator denominator exponent add")):
def process(self):
value = (self.numerator/self.denominator) ** (self.exponent)
return value + self.add
mynumber = Numbers(1+2, 3+4, 5+6, 2)
我猜誰說的意思只是你不應該具備的功能有20個參數。當然在你的情況下,有一個參數是完全合理的。 – nbro
只是回聲的@nbro,在這種情況下,假設你的函數只有一個參數是合乎邏輯的。這不會使代碼變得不那麼幹淨。如果你想讓這個參數少一些,你總是可以提示參數。通過讓函數提示它,讓呼叫者輸入數字添加兩個(如果用例允許這樣的可能性) – Amit
您的方法仍然採用參數'self' ... – Fabricator