2017-01-10 2 views
1

Я пытаюсь понять следующий питона фрагмент кода:Python синтаксис: х = SomeClass (some_input) (х)

x = SomeObject 
x = SomeClass(some_input)(x) 

Может кто-нибудь пролить некоторый свет на то, что здесь происходит?

+1

'SomeClass', по-видимому, можно вызывать, поэтому, когда вы создаете экземпляр -' y = SomeClass (some_input) '- вы можете его назвать:' y (...) '. – Ryan

+0

Можете ли вы дать определения для 'SomeObject' и' SomeClass'? – Tagc

+0

Определение класса немного связано с тем, чтобы опубликовать его здесь. Но, спасибо, указав мне направление «вызываемых классов», я, очевидно, должен изучить эту концепцию, чтобы понять этот синтаксис. – user1934212

ответ

1

Продление другие ответ попытается дать более общий ответ, о том, как Python будет решить, что заявление

x = SomeClass(some_input)(x) 

интерпретатор First Python будет пытаться решить заявление после =, а затем назначить его x, так что этот отпуск мы with_

SomeClass(some_input)(x) 

В этом заявлении есть два основных элемента SomeClass Instation и call для результата, например, который должен быть вызываемым)

SomeClass(some_input): (x) 
#---instantiation----:--call-- 

Это позволит решить сначала левую сторону, чтобы определить, что должно быть под названием, в левой части У нас есть экземпляр класса, это означает, что интерпретатор Python вызовет метод SomeClass.__init__(...) с аргументами (some_input). Это связано с тем, что если some_input является вызовом метода, экземпляра, самой формулы или так, она попытается решить эту проблему в первую очередь.

SomeClass(some_input) # => <new object> 

Это <new_object> это тот, кто будет под названием с аргументами (x) и это возможно потому, что SomeClass может (и должен в этом примере) быть вызываемая только с внедрением метода __call__, как вы могли бы сделать с __init__, как пример:

class Add: 
    def __init__(self, num1, num2): 
     self.num1 = num1 
     self.num2 = num2 
     print "Sum of", self.num1,"and",self.num2, "is:" 

    def __call__(self): 
     return (self.num1 + self.num2) 

add = Add(1,2) 
print add() 

+ More info about objects being callables

примечание: Ссылка на ссылку <new_object>, так как она не связана с какой-либо переменной, будет потеряна после последнего утверждения.

3

Это может быть упрощена следующим образом (при условии, что вспомогательные переменные y и z не используются окружив код):

y = SomeObject 
z = SomeClass(some_input) 
x = z(y) 
+1

Спасибо за ваш ответ. Но что здесь происходит: x = z (y)? Выглядит как вызов функции, но z является объектом SomeClass, а не функцией ... – user1934212

+1

В выражении 'z (y)' 'z' должен быть [вызываемый] (http://stackoverflow.com/ questions/111234/what-is-call-in-python) (функции - всего лишь один пример вызываемых объектов). – Leon

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