Метод и атрибут

Мне было интересно, что произойдет, если метод и атрибут имеют одно и то же имя в классе. Будет ли программа сначала искать атрибут в объекте, и если метод в классе имеет то же имя, будет ли программа пропустить его и просто сфокусироваться на объекте?

2
nl ja de
методы - это просто объекты, такие как строки, ints, списки и т. д. То, что вы считаете «методом», - это просто объект, на который ссылается атрибут.
добавлено автор John La Rooy, источник
Это будет тот, который определяется последним
добавлено автор Volatility, источник
Легкий способ ответить на этот вопрос - написать такой класс и посмотреть, что произойдет.
добавлено автор cms_mgr, источник

2 ответы

Ответ Якоба в основном точный, но неполный. Если x , определенный в классе, следует за протоколом дескриптора и имеет методы __ get __ и __ set __ , то он будет продолжать иметь приоритет над любым 'x 'в словаре экземпляра. Самый простой способ увидеть это - использовать свойство :

>>> class Example(object):
    def __init__(self):
        self.x = 44

    @property
    def x(self):
        return "hi"
    @x.setter
    def x(self, value):
        self.__dict__['x'] = value


>>> Example().x
'hi'
>>> Example().__dict__['x']
44

Таким образом, фактическое правило заключается в том, что Python смотрит в класс (и его базы), и если он находит соответствующий объект, а объект имеет метод __ get __ (или __ set __ ), если параметр ), то он вызывает метод __ get __ , иначе он ищет атрибут экземпляра и использует его, если он есть или не возвращается к использованию атрибута класса (то есть метода).

Поиск может быть еще более сложным, если определен либо __ getattribute __ , либо __ getattr __ .

1
добавлено

Это зависит от того, какой из них назначается первым.

Если сначала назначить метод, атрибут будет тем, к которому вы будете обращаться,

например

class Example(object):
    def __init__(self):
        self.x = 44

    def x(self):
        return "hi"

print Example().x

Методы «назначаются» при обработке класса, где при инициализации x назначается. Это означает, что x перезаписывает метод.

Это, конечно, отличается для атрибутов уровня класса, поскольку они назначаются одновременно с методом

class Example(object):
    x = 43

    def x(self):
        return "hi"

print Example().x

Показывает, что метод перезаписывает атрибут.

1
добавлено
Порядок присваивания не имеет значения: у вас может быть класс с назначенным атрибутом x , затем назначьте Example.x = , и вы назначили второй, но атрибут экземпляра по-прежнему имеет приоритет. Также, как я объясняю в своем ответе, объект в классе будет иметь приоритет, если он является дескриптором.
добавлено автор Duncan, источник
Важным ключом к пониманию этого является то, что функции/методы в Python сами являются объектами. Создание метода в корне присваивает значение атрибуту; это просто значение, которое можно вызывать. Как только у вас есть это понимание, нетрудно увидеть, что назначение, которое происходит последним, «побеждает».
добавлено автор GrandOpener, источник
Спасибо! Но вы сказали, что x назначается при инициализации, а это значит, что метод назначен первым, поэтому не должен печатать Example (). X return hi? потому что он был определен последним?
добавлено автор John, источник
«просто видеть, что побеждает назначение, которое происходит последним». «Я понимаю, что вы имеете в виду, но назначение, которое было последним в приведенном выше примере, первым было def x (self) ... которое возвращает hi. И вот почему он должен распечатывать привет. потому что это было последнее определение.
добавлено автор John, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community