一般来说
,是真正糟糕的一般建议,没有参数的方法对于修改的对象在需要没有外部数据,或功能,只有拥有全局交互的方式对象是大(你应该真的很少需要这样做)。在你的情况下,你需要用外部数据修改给定的对象,并且这两个对象都是内置类型(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