1

描述符文档:

描述符可以通过其方法名直接调用。例如,d.__get__(obj)

下面这个类的例子是什么?

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

例如,什么是d和什么是obj"d.__get__(obj)"上面的类/实例将如何调用?

4

2 回答 2

2

工作示例

要使您的示例成为描述符,它需要有一个__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) 使用点运算符调用具有正常属性查找的描述符。

这就是它的全部内容:-)

于 2019-10-21T00:40:23.523 回答
1

描述符是一种使代码看起来像数据并实现多态性的方法。

您链接到的页面上有一个很好的示例,在“描述符示例”下,我将在此处复制它:

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 属性?

在您的情况下,您还需要添加一个使用您制作的描述符的类。

于 2019-10-21T00:33:53.163 回答