Недавно я прочитал official HOW-TO about Python descriptors, который на самом деле происходит от an essay, написанного Раймондом Хеттингером давным-давно. Но, прочитав его несколько раз, я все еще смущен некоторыми его частями. Я приведу некоторые параграфы, за которыми следуют мои путаницы и вопросы.Заблуждения о дескрипторах Python и руководстве по описанию
Если словарь Экземпляр имеет запись с таким же именем, как дескриптор данных, дескриптор данных имеет приоритет. Если словарь экземпляра имеет запись с тем же именем, что и дескриптор не данных, запись словаря имеет приоритет.
- Это то же самое с классом? Какова цепочка приоритетов для класса, если в его словаре есть запись с тем же именем, что и дескриптор данных/данных?
Для объектов, машины в
object.__getattribute__()
, который трансформируетb.x
вtype(b).__dict__['x'].__get__(b, type(b))
. Реализация работает через цепочку приоритетов, которая дает приоритет дескрипторам данных над переменными экземпляра, приоритет переменных экземпляра над дескрипторами без данных и присваивает наименьший приоритет__getattr__()
, если это предусмотрено.Для классов оборудование находится в
type.__getattribute__()
, которое преобразуетB.x
вB.__dict__['x'].__get__(None, B)
.
- Приведенных выше двух абзацев сказать процесс бытия дескриптора вызывается автоматически при доступе к атрибутам. В нем перечисляется разница между доступом к атрибуту экземпляра (
b.x
) и классом (B.x
). Тем не менее, вот мои неурядицы:- если атрибут класса или экземпляр не дескриптор, будет преобразование (т.е. превращает
b.x
вtype(b).__dict__['x'].__get__(b, type(b))
иB.x
вB.__dict__['x'].__get__(None, B)
) еще продолжается? Возвращает ли атрибут в этом классе или экземпляре dict непосредственно проще? - Если словарь экземпляра имеет запись с тем же именем, что и дескриптор без данных, в соответствии с правилом приоритета в первой цитате, запись словаря имеет приоритет, в это время будет продолжаться преобразование? Или просто верните значение в его dict?
- если атрибут класса или экземпляр не дескриптор, будет преобразование (т.е. превращает
дескрипторов Номера данных обеспечивает простой механизм для вариаций на обычных формах связывания функций в методы.
- выбран дескрипторы без данных, поскольку функции/методы могут быть только получили, но не может быть установить?
- В чем заключается механизм привязки функций к методам?Поскольку словари классов хранят методы как функции, если мы вызываем один и тот же метод с использованием класса и его экземпляра соответственно, как может основная функция определить, должен ли его первый аргумент self или нет?
Функция имеет метод
__get__()
, так что они могут быть преобразованы к способу при обращении в качестве атрибутов. Дескриптор без данных преобразует вызовobj.f(*args)
вf(obj, *args)
. Вызовklass.f(*args)
будет f (* args).
- Как дескриптор без данных может превратить
obj.f(*args)
вызов вf(obj, *args)
? - Как преобразовать дескриптор без данных
klass.f(*args)
вf(*args)
? - Каков основной механизм этих двух преобразований? Почему существуют различия между классом и экземпляром?
- Какова роль метода
__get__()
в соответствии с вышеуказанным обстоятельством?