2013-02-24 3 views
1

У меня есть следующий классPython Может ли классы принимать аргументы?

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, когда я создаю класс (если я могу)?
+1

Просто FYI: '*' называется оператором _splat_. – aviraldg

+0

спасибо aviraldg. –

+1

@aviraldg - Мне нравится называть его * splat * тоже, но я думаю, что это также обычно называют оператором распаковки. – mgilson

ответ

3
  1. *args* синтаксис имеет зеркальную призывающую эквивалент:

    p = MetricArg(*somelist) 
    

    Элементы somelist будут использоваться в качестве аргументов MetricArg.

  2. Это зависит от того, какой API вы хотите представить. Если вы хотите принять 0 или более аргументов, так как вы ожидаете, что ваш класс будет называться наиболее удобно, вы используете эту форму.

    В API Python функции print() и os.path.join() являются хорошо известными примерами вызовов, которые используют список параметров произвольной длины.

1

Вы можете передать список в VARIADIC функции или конструктора

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

ли не используя VARIADIC функцию вместо функции принятия списка это действительно зависит от функции.

Будет ли часто возникать функция/конструктор с динамически сконструированным списком или будет получать в основном фиксированное количество параметров?

Если список в основном динамический, то прием списка - лучшая идея, потому что вы не будете загромождать код *L. С другой стороны, если в большинстве случаев количество аргументов фиксировано в вызывающем, а малые, то просто передача аргументов более читабельна, чем создание списка для его передачи.