Вопросы о стандартных функциях класса в Python - PullRequest
0 голосов
/ 23 ноября 2018

Рассмотрим следующий пример итеративного класса, который делает факториалы из заданного числа:

import math

class Factorial(object):
  def __init__(self, num, maxsize=10e12):
    self.num = num
    self.maxsize = maxsize
  def __repr__(self):
    if __name__ == '__main__':
      return f'<{self.__class__.__name__} object at {hex(id(self.__class__))}>'
    else:
      return '<' + self.__class__.__module__ + '.' + self.__class__.__name__ + ' object at ' + hex(id(self.__class__)) + '>'
  def __iter__(self):
    for i in range(1,self.num+1):
      if math.factorial(i) > self.maxsize:
        break
      yield math.factorial(i)

Итак, конечно, у нас есть методы __init__, __repr__ и __iter__, которыеЯ все читал об онлайн.У меня два вопроса:

  1. Как бы вы назвали эти методы?Я знаю, что вы можете описать __init__ как своего рода конструктор, но есть ли специальное имя, к которому относятся все эти __<blah>__ методы, когда дело доходит до классов?

  2. Есть лисписок всех этих так называемых «специальных» или «встроенных» функций класса, который сообщает, что они из себя представляют и что они делают в контексте класса?Те, о которых я уже знаю, это __init__, __enter__, __next__, __exit__, __iter__, __str__, __repr__ и __call__.Или это почти полный список, за исключением нескольких?

Я уже некоторое время ломал голову над этим (в основном потому, что не знаю, как позвонить)эти функции, поэтому я не могу их исследовать).

1 Ответ

0 голосов
/ 03 мая 2019

Поскольку на этот разумный вопрос нет ответа, я обобщу предложения, приведенные в комментариях, как вики сообщества.

Официальная документация Python в основном вызывает такие методы, как __init__ и __iter__ "specialметоды «.У них есть список их в его главе о модели данных Python .

Программисты Python часто используют менее формальный термин "магические методы".Или, поскольку имена окружены двойным подчеркиванием, термин «метод dunder» может иметь смысл, особенно если вам нужно будет произносить их имена вслух (вы можете сказать «dunder init» как простой и понятный).способ выразить имя __init__ без завязывания языка узлами, подход , популяризированный Недом Батчелдером ).

Стоит отметить, что некоторые объекты имеют специальные атрибуты, которые на самом деле не являются методами.Например, функции и модули имеют атрибут __name__, который является строкой.(Модуль __name__ можно использовать как глобальную переменную внутри модуля, и вы часто будете использовать его в шаблоне if __name__ == "__main__".) Все объекты должны иметь атрибут __class__ (который является ссылкой на их тип)и у многих также будет атрибут __dict__ (словарь).

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