了解 python 描述符示例 (TypedProperty)
understanding a python descriptors example (TypedProperty)
这里是 python 一本书中的一些代码的略微修改版本:
class TypedProperty(object):
def __init__(self,name,type,default=None):
self.name = "_" + name
self.type = type
self.default = default if default else type()
def __get__(self,instance,cls):
return getattr(instance,self.name,self.default)
def __set__(self,instance,value):
if not isinstance(value,self.type):
raise TypeError("Must be a %s" % self.type)
setattr(instance,self.name,value)
class Foo(object):
name = TypedProperty("name",str)
num = TypedProperty("num",int,42)
f = Foo()
f.name = 'blah'
我的问题:我们为什么要在 f 中创建属性?在上面的代码中,TypedProperty 的编写方式是 f.name = 'blah' 在实例 f.
中创建属性“_name”
为什么不将值保存为 class TypedProperty 的属性?这是我的想法:
class TypedProperty2(object):
def __init__(self, val, typ):
if not isinstance(val, typ):
raise TypeError()
self.value = val
self.typ = typ
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, val):
if not isinstance(val, self.typ):
raise TypeError()
self.value = val
这是一个任意的设计决定吗?
class 的所有 个实例将共享相同的描述符实例(例如 TypedProperty
)。因此,如果您将值存储在 TypedProperty
上,则 Foo
的所有实例对于 name
和 num
值都将具有相同的值。这对于描述符来说通常是不可取的(或预期的)。
例如如果您 运行 以下脚本:
class TypedProperty2(object):
def __init__(self, val, typ):
if not isinstance(val, typ):
raise TypeError()
self.value = val
self.typ = typ
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, val):
if not isinstance(val, self.typ):
raise TypeError()
self.value = val
class Foo(object):
name = TypedProperty2("name", str)
f1 = Foo()
f1.name = 'blah'
f2 = Foo()
print(f2.name)
f2.name = 'bar'
print(f1.name)
您将看到以下输出:
blah
bar
所以我们可以看到最初 f2
有 f1
的名字,然后在更改 f2
的名字后,f1
获得了 f2
的名字。
这里是 python 一本书中的一些代码的略微修改版本:
class TypedProperty(object):
def __init__(self,name,type,default=None):
self.name = "_" + name
self.type = type
self.default = default if default else type()
def __get__(self,instance,cls):
return getattr(instance,self.name,self.default)
def __set__(self,instance,value):
if not isinstance(value,self.type):
raise TypeError("Must be a %s" % self.type)
setattr(instance,self.name,value)
class Foo(object):
name = TypedProperty("name",str)
num = TypedProperty("num",int,42)
f = Foo()
f.name = 'blah'
我的问题:我们为什么要在 f 中创建属性?在上面的代码中,TypedProperty 的编写方式是 f.name = 'blah' 在实例 f.
中创建属性“_name”为什么不将值保存为 class TypedProperty 的属性?这是我的想法:
class TypedProperty2(object):
def __init__(self, val, typ):
if not isinstance(val, typ):
raise TypeError()
self.value = val
self.typ = typ
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, val):
if not isinstance(val, self.typ):
raise TypeError()
self.value = val
这是一个任意的设计决定吗?
class 的所有 个实例将共享相同的描述符实例(例如 TypedProperty
)。因此,如果您将值存储在 TypedProperty
上,则 Foo
的所有实例对于 name
和 num
值都将具有相同的值。这对于描述符来说通常是不可取的(或预期的)。
例如如果您 运行 以下脚本:
class TypedProperty2(object):
def __init__(self, val, typ):
if not isinstance(val, typ):
raise TypeError()
self.value = val
self.typ = typ
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, val):
if not isinstance(val, self.typ):
raise TypeError()
self.value = val
class Foo(object):
name = TypedProperty2("name", str)
f1 = Foo()
f1.name = 'blah'
f2 = Foo()
print(f2.name)
f2.name = 'bar'
print(f1.name)
您将看到以下输出:
blah
bar
所以我们可以看到最初 f2
有 f1
的名字,然后在更改 f2
的名字后,f1
获得了 f2
的名字。