Дескрипторы Python - PullRequest
       26

Дескрипторы Python

1 голос
/ 21 октября 2019

Из дескриптора документы:

Дескриптор может быть вызван непосредственно по имени метода. Например, d.__get__(obj).

Что может быть примером этого со следующим классом?

class Descriptor:
    def __init__(self, color="red"):
        self.color = color

Например, что такое d, а что obj? Как будет "d.__get__(obj)" вызываться с вышеуказанным классом / экземпляром?

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Рабочий пример

Чтобы сделать ваш пример дескриптором, он должен иметь метод __ get __ () :

class Descriptor:
    def __init__(self, color="red"):
        self.color = color
    def __get__(self, obj, objtype=None):
        return obj.size + ' ' + self.color

Использованиеэтот дескриптор в другом классе:

class A:
     pair = Descriptor('green')
     def __init__(self, size):
          self.size = size

Вызов дескриптора как этот:

>>> a = A('big')
>>> a.pair
'big green'

Надеюсь, этот рабочий пример помогает: -)

Ключевые моменты

1) Класс является дескриптором , если он определяет любой из __ get __ () , __ set __ () или _ _delete __ () .

2) Запустите его, создав экземпляр дескриптора и сохранив его как переменную класса в другом классе.

3) Вызовите дескриптор с помощьюнормальный поиск атрибутов с использованием оператора точки.

Вот и все, что нужно сделать: -)

1 голос
/ 21 октября 2019

Дескрипторы - это способ сделать код похожим на данные, а также добиться полиморфизма.

На странице, на которую вы ссылаетесь, есть хороший пример, в разделе «Пример дескриптора» я скопирую его здесь:

class RevealAccess(object):
    """A data descriptor that sets and returns values
       normally and prints a message logging their access.
    """

    def __init__(self, initval=None, name='var'):
        self.val = initval
        self.name = name

    def __get__(self, obj, objtype):
        print('Retrieving', self.name)
        return self.val

    def __set__(self, obj, val):
        print('Updating', self.name)
        self.val = val

>>> class MyClass(object):
...     x = RevealAccess(10, 'var "x"')
...     y = 5
...
>>> m = MyClass()
>>> m.x
Retrieving var "x"
10
>>> m.x = 20
Updating var "x"
>>> m.x
Retrieving var "x"
20
>>> m.y
5

Видите ли вы, как класс MyClass назначает дескриптор RevealAccess его атрибуту x?

В вашем случае вам также необходимо добавить класс, который использует созданный вами дескриптор.

...