2017-02-17 12 views
0

Я просто пытаюсь обернуть мою голову вокруг синтаксиса здесь:Numpy функции/методы без скобок объяснения

# some data 
import numpy as np 
x = linspace(0, 1, 100) 

x.sum() # works with brackets 
> 50.0 

x.shape # works without brackets 
> (100,) 

x.shape() # fails with brackets 
> TypeError 

Почему это, что некоторые методы/функции имеют скобки, а другие нет?

+0

sum - целое число, форма является 1-элементным кортежем. –

+0

'форма' не метод. – user2357112

+1

Те, у которых '()' являются методами, те, у которых нет '()', являются свойствами или атрибутами. – MSeifert

ответ

3

Когда вы получаете доступ к атрибуту своего экземпляра, вы действительно получаете доступ к дескриптору. Есть три случая:

  • Дескриптор возвращает функцию как x.sum, которая возвращает связанную функцию. Связано, потому что первый аргумент этой функции будет x. Вам, очевидно, нужно вызвать функцию (), чтобы дать вам результат.

  • Есть атрибуты класса и экземпляра, которые просто возвращают значение, либо сохраненное в x.__dict__, либо x.__class__.__dict__. Вам не нужно ничего называть, чтобы получить их. Однако x.shape не из тех!

  • Есть properties, при доступе к ним он будет неявно вызовите метод вашего класса. В общих свойствах, например, x.something, эквивалентны x.__class__.something.fget(x). Кажется странным, но работает ... вроде как. Важно то, что вам обычно не нужно называть это напрямую (), потому что вы можете просто сделать x.something.


Но это техническая, возможно, более простое объяснение лучше помнить:

  • sum является метод. Следует называть методы. Чтобы вызвать функцию или метод, вам понадобится ().
  • shape - свойство (но также может быть атрибутом), и вам не нужно их называть! Он также может вернуть функцию, но в этом случае он возвращает tuple, и вы не можете вызвать экземпляр tuple.