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) 使用点运算符调用具有正常属性查找的描述符。
真的就这些了:-)
来自 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) 使用点运算符调用具有正常属性查找的描述符。
真的就这些了:-)