我目前正在阅读O Reilly Python Cookbook,但我对以下代码感到困惑:
class Descriptor:
def __init__(self, name=None, **opts):
self.name = name
self.__dict__.update(opts)
def __set__(self, instance, value):
instance.__dict__[self.name] = value
# Descriptor for enforcing types
class Typed(Descriptor):
expected_type = type(None)
def __set__(self, instance, value):
if not isinstance(value, self.expected_type):
raise TypeError('expected ' + str(self.expected_type))
super().__set__(instance, value)
class Integer(Typed):
expected_type = int
我知道如何设置实例属性。
我对以下行感到困惑:
instance.__dict__[self.name] = value
为什么要这样做?因为这意味着可以为实例属性指定一个与声明类时最初设置的名称不同的名称。例如:
class A:
x = Integer('d')
b=A()
b.x=5
b.x
<__main__.Integer at 0x1188d1390>
b.d
5
我们已经用 b 覆盖了名称 x。为什么允许这样做?
我也对init函数中的以下内容感到困惑:
self.__dict__.update(opts)
为什么我们要使用附加属性填充类型检查描述符?
这些添加的属性有什么作用?