Python - Когда использовать () - PullRequest
       2

Python - Когда использовать ()

0 голосов
/ 10 октября 2018

Народ,

После долгих поисков и чтений я пришел к выводу, что методы используют (), а атрибуты - нет.

Пример использования arr=np.arrange(25):

Чтобы найти размер массива, который я бы использовал: arr.size Это атрибут.

Чтобы найти максимум массива, который я бы использовал: arr.max() Это метод.

Для меня, как для программиста-любителя Python, я не могу на всю жизнь сказать, в чём заключается реальная разница. (Примечание. Я понимаю, что атрибут находится в _ _init_ _, а методы - нет.) Действительно ли человек, который написал класс, случайно решил указать размер как атрибут, а max - как метод?Есть ли какой-нибудь способ сказать при написании кода интуитивно знать, когда использовать (), а когда нет, не просматривая список методов и атрибутов для каждого класса?

Спасибо за помощь и извините, если у меня есть какие-либоневерных терминов.

1 Ответ

0 голосов
/ 10 октября 2018

Полная история немного сложна (см. Python: метод __getattribute__ и дескрипторы и python __getattribute__ override и @property decorator и перейдите по ссылкам на wiki по протоколам дескрипторов ), но вкратце вы пишете:

somevar.thing()

, когда хотите вызвать thing, и вы пишете:

somevar.thing

, если вы хотите использовать значение thing.Это использование аналогично функциям и функциям:

def f(arg):
    print('f called, arg =', arg)
    return 42

x = f('douglas adams')
print('f returned', x)

y = x
print('I just set y to x:', y)

y = f
print('this time I did not call', y)

, которые при запуске (как Python3 или с from __future__ import print_function в Python2) выводят:

f called, arg = douglas adams
f returned 42
I just set y to x: 42
this time I did not call <function f at ...>

Если мыпопробуйте сделать y = x(), это не удастся, потому что мы не можем вызвать 42.

Если вы собираетесь определить, как использовать thing, определите его как методесли он должен быть , называемым , и в качестве атрибута экземпляра, если он просто должен использоваться (и / или иметь какое-либо значение).Если вы примете неправильное решение - если вы сделаете его атрибутом экземпляра used / set, а потом выяснится, что вам нужна функция, - вы можете обойти его позже с помощью @property.


Что особенногоо методах экземпляра заключается в том, что когда вы вызываете их - или даже когда нет - вы получаете дополнительный аргумент self.Реализация, в которой это происходит, отличается в Python2 и Python3, но:

class K(object):
    def method(self, arg):
        print('method called, arg is', arg)

x = K()
x.method(42)

печатает:

method called, arg is 42

Обратите внимание, что если мы не вызываем егомы видим это как «связанный метод»:

print('x.method is', x.method)

производит:

x.method is <bound method K.method of <__main__.K object at ...>>

Если мы посмотрим на K.method напрямую, разница между Python2 и Python3 обнаруживается:

$ python2 x.py
K.method is <unbound method K.method>
$ python3.6 x.py
K.method is <function K.method at ...>

но, в конце концов, это всего лишь дескрипторные протоколы, а реализация CPython способна сделать несколько кратких .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...