【问题标题】:Python Can classes take arguments?Python 类可以接受参数吗?
【发布时间】:2013-02-24 21:20:04
【问题描述】:

我有以下课程

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(如果可以)?

【问题讨论】:

  • 仅供参考:* 被称为 splat 运算符。
  • @aviraldg -- 我也喜欢称它为 splat,但我认为它通常也被称为解包运算符。

标签: python class optimization arguments code-structure


【解决方案1】:
  1. *args* 语法有一个等效的镜像调用:

    p = MetricArg(*somelist)
    

    somelist 的元素将用作MetricArg 的参数。

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多