我有以下类
class MetricLst(object):
def __init__(self,n):
self.min = min(n)
self.max = max(n)
lst = [1,2,3,4,5]
p = MetricLst(lst)
print p.max
5
print p.min
1
带自变量
class MetricArg(object):
def __init__(self,*args):
self.min = min(args)
self.max = max(args)
p = MetricArg(1,2,3,4,5)
p.max
print 5
p.min
print 1
我有以下问题:
- 如果我使用MetricArg,有没有一种优雅的方法来创建对象使用列表
- 当我创建一个类时,我是否需要preferre*args(如果可以的话)
-
*args*
语法具有镜像调用等效项:p = MetricArg(*somelist)
somelist
的元素将用作MetricArg
的参数。 -
这取决于您想要呈现哪种类型的API。如果你想接受0个或更多的参数,因为这是你期望类被最方便地调用的方式,那么你可以使用这种形式
在Python API中,
print()
和os.path.join()
函数是使用arbitry-length参数列表的可调用函数的众所周知的示例。
您可以将列表传递给可变函数或构造函数
L = [1, 2, 3, 4, 5]
p = MetricArg(*L)
是否使用变元函数而不是接受列表的函数,实际上取决于函数。
函数/构造函数是否经常使用动态构建的列表进行调用,或者它是否主要接收固定数量的参数?
如果列表大部分是动态的,那么接受一个列表是最好的主意,因为您不会用*L
来打乱代码。另一方面,如果在大多数情况下,调用者中的参数数量是固定的并且很小,那么仅仅传递参数比仅仅构建一个列表来传递参数更具可读性