下面是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中创建属性“\u name”
为什么不将这些值保存为类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
这是一个武断的设计决定吗?你知道吗
类的所有实例将共享描述符的相同实例(例如
TypedProperty
)。因此,如果将值存储在TypedProperty
上,那么Foo
的所有实例的name
和num
值都将具有相同的值。对于描述符来说,这通常是不可取的(或预期的)。你知道吗例如,如果运行以下脚本:
您将看到以下输出:
所以我们可以看到,最初
f2
有f1
的名字,然后,在改变f2
的名字之后,f1
得到了f2
的名字。你知道吗相关问题 更多 >
编程相关推荐