1

我有以下课程

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

我有以下问题:

  1. 如果我使用 MetricArg,是否有一种优雅的方式来使用列表创建对象?
  2. 创建课程时是否需要首选 *args(如果可以)?
4

2 回答 2

3
  1. *args*语法有一个镜像调用等价物:

    p = MetricArg(*somelist)
    

    的元素somelist将用作 的参数MetricArg

  2. 这取决于你想要呈现什么样的 API。如果您想接受 0 个或多个参数,因为这是您希望最方便地调用您的类的方式,那么您可以使用该形式。

    在 Python API 中,print()os.path.join()函数是众所周知的使用任意长度参数列表的可调用示例。

于 2013-02-24T21:22:09.297 回答
1

您可以将列表传递给可变参数函数或构造函数

L = [1, 2, 3, 4, 5]
p = MetricArg(*L)

是否使用可变参数函数而不是接受列表的函数实际上取决于函数。

函数/构造函数会经常被动态构造的列表调用,还是会接收大部分固定数量的参数?

如果列表大部分是动态的,那么接受一个列表是最好的主意,因为您不会用*L. 另一方面,如果在大多数情况下,调用者的参数数量是固定的并且很小,那么只传递参数比构建一个列表来传递它更具可读性。

于 2013-02-24T21:25:08.650 回答