Python 个描述符

Python descriptors

来自 descriptor 文档:

A descriptor can be called directly by its method name. For example, d.__get__(obj).

下面的例子是什么 class?

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

例如,什么是d,什么是obj"d.__get__(obj)" 怎么用上面的 class/instance 调用?

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

您链接到的页面上有一个很好的例子,在 "Descriptor Example" 下 我会复制到这里:

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

您看到 class MyClass 如何将 RevealAccess 描述符分配给它的 x 属性了吗?

在您的情况下,您还需要添加一个 class 来使用您创建的描述符。

工作示例

要使您的示例成为描述符,它需要有一个 __get__() 方法:

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

在另一个 class 中使用该描述符:

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

像这样调用描述符:

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

希望这个工作示例对您有所帮助:-)

要点

1) 如果定义了 __get__()[= 中的任何一个,则 class 是 descriptor 42=](),或__delete__().

2) 通过创建描述符的实例并将其作为 class 变量存储在另一个 class.

中来使其工作

3) 使用点运算符调用具有正常属性查找的描述符。

真的就这些了:-)