理解python描述符示例(TypedProperty)

时间:2016-01-19 19:03:52

标签: python class descriptor

以下是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))

这是一个任意的设计决定吗?

1 个答案:

答案 0 :(得分:2)

该类的所有实例将共享描述符的同一实例(例如TypedProperty)。因此,如果您将值存储在TypedProperty上,那么Foo的所有实例将具有namenum值的相同值。对于描述符来说,这通常 是不可取的(或预期的)。

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

所以我们可以看到最初f2f1的名称,然后在更改f2的名称后,f1选择了f2'的名字。