以下是python一书中的一些代码的略微修改版本:
barplot
我的问题:我们为什么要在f中创建属性?在上面的代码中,TypedProperty被写成f.name =' blah'创建属性" _name"在实例f。
为什么不将值保存为TypedProperty类的属性?这就是我的想法:
barplot(prop.table(sapply(df[2:4],
function(x) table(factor(x, levels=0:1))),2))
这是一个任意的设计决定吗?
答案 0 :(得分:2)
该类的所有实例将共享描述符的同一实例(例如TypedProperty
)。因此,如果您将值存储在TypedProperty
上,那么Foo
的所有实例将具有name
和num
值的相同值。对于描述符来说,这通常 是不可取的(或预期的)。
e.g。如果您运行以下脚本:
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
'的名字。