2017-01-20 4 views
1

Скажем, у меня есть функция, и класс, как это,Возвращаемые значения из функции в качестве атрибутов класса

>>> def something(): 
...  x = 5 
...  y = 6 
...  return x, y 

>>> class SomethingElse(): 
...  def __init__(self, x, y): 
...    self.x = x 
...    self.y = y 
...    print(x+y) 
... 

Я хочу передать то, что моя функция возвращает в качестве атрибутов моего класса, возможно ли это сделать? Поскольку я, когда я вызываю свою функцию, получаю ее как только 1 атрибут.

>>> S = SomethingElse(5, 6) 
11 
>>> S1 = SomethingElse(something) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __init__() missing 1 required positional argument: 'y' 

То, что я на самом деле хочу,

>>> S1 = SomethingElse(something) 
11 

ответ

3

Вы можете использовать восклицательный знак (или "распаковка") оператора *, как и

>>> SomethingElse(*something()) 
11 

Это можно увидеть в Unpacking Argument Lists в учебнике Python и обычно называется распаковкой аргументов.

-1

У вас есть несколько вариантов.

Этот делает y необязательным аргументом. Звоните, используя SomethingElse(something()) или SomethingElse(5, 6).

class SomethingElse(): 
    def __init__(self, x, y=None): 
     if y is None: 
      x, y = *x 
     self.x = x 
     self.y = y 
     print(x + y) 

Этот определяет вспомогательную функцию make_kind, которая возвращает новый экземпляр SomethingElse целиком. Вы можете назвать это, используя SomethingElse.make_kind(); нет self необходим пареметр.

class SomethingElse(): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 
     print(x + y) 

    @staticmethod 
    def make_kind(): 
      x = 5 
      y = 6 
      return SomethingElse.__init__(x, y) 

Узнайте больше о @staticmethod на официальном языке Python 3.5 Docs.

+1

Я не думаю, что это действительно затрагивает вопрос вообще. –

+0

@ juanpa.arrivillaga почему бы и нет? Просто «я не думаю, что это действительно затрагивает вопрос вообще», это не полезно. –

+1

Вопрос в том, как передать кортеж в конструктор. Ваш первый вариант действительно не имеет смысла и должен быть заменен использованием оператора splat. Второй вариант делает предположения о дизайне - он может быть правильным решением, но опять же, не отвечает на заданный вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^