RNA*_*RNA 4 python descriptor python-descriptors
我从有效的Python项目31中获得以下示例:
from weakref import WeakKeyDictionary
class Grade(object):
def __init__(self):
self._values = WeakKeyDictionary()
def __get__(self, instance, instance_type):
if instance is None: return self
return self._values.get(instance, 0)
def __set__(self, instance, value):
if not (0 <= value <= 100):
raise ValueError('Grade must be between 0 and 100')
self._values[instance] = value
# Example 16
class Exam(object):
math_grade = Grade()
writing_grade = Grade()
science_grade = Grade()
first_exam = Exam()
first_exam.writing_grade = 82
second_exam = Exam()
second_exam.writing_grade = 75
print('First ', first_exam.writing_grade, 'is right')
print('Second', second_exam.writing_grade, 'is right')
Run Code Online (Sandbox Code Playgroud)
我想不出任何理由都if instance is None: return self在__get__。一个如何能Exam(或其他潜在的类中使用Grade)的实例是None?
None当访问类的描述符时,Python将传入实例。
通过返回self这种情况,您可以访问类上的描述符对象,而不必绕过协议(通过访问ClassObj.__dict__['name_of_descriptor'])。
>>> class DemoDescriptor:
... def __get__(self, instance, type_):
... if instance is None:
... print('Accessing descriptor on the class')
... return self
... print('Accessing descriptor on the instance')
... return 'Descriptor value for instance {!r}'.format(instance)
...
>>> class DemoClass(object):
... foo = DemoDescriptor()
...
>>> DemoClass.foo # on the class
Accessing descriptor on the class
<__main__.DemoDescriptor object at 0x1041d3c50>
>>> DemoClass.__dict__['foo'] # bypassing the descriptor protocol
<__main__.DemoDescriptor object at 0x1041d3c50>
>>> DemoClass().foo # on the instance
Accessing descriptor on the instance
'Descriptor value for instance <__main__.DemoClass object at 0x1041d3438>'
Run Code Online (Sandbox Code Playgroud)
这也是和对象的__get__方法实现的工作方式。functionproperty
针对您的特殊情况下,每个的Exam.math_grade,Exam.writing_grade或Exam.science_grade将调用Grade.__get__,在传递None的实例,并Exam为instance_type。
| 归档时间: |
|
| 查看次数: |
939 次 |
| 最近记录: |