Python描述符没有钩住类级属性

时间:2014-02-26 19:20:19

标签: python descriptor

我想为ECMAScript 5“冻结”对象制作一个类似的功能,你不能在其上做任何改变。

这样做了:

class Fixed(object):
        frzn = 'I AM AWESOME'
        def holdset(_,val):
                _.frzn = _.frzn
                print "frozen is frozen not setting to ", val
        frozen = property(fset=holdset)

        @classmethod
        def __setattr__(self, name, val):
                if name=="frozen":
                        print "You can't unfreeze the frozen"
                else:   
                        self.name = val

dd = Fixed()
dd.frozen = 12312312
dd.frozen = 'AA'
Fixed.frozen = {}
print dd.frozen
print Fixed.frozen

哪个给出了

You can't unfreeze the frozen You can't unfreeze the frozen {} {}

当前两个赋值将属性引用为实例成员时,前两个赋值失败。当属性被引用为类成员时,第三个赋值成功。

我不明白为什么。

如何制作

Fixed.frozen = {}

以与其他作业相同的方式失败?为什么不呢?

1 个答案:

答案 0 :(得分:2)

您需要覆盖Metaclass的__setattr__。 Metaclass是一个创建类的类(类似于由类创建的实例),因此,要覆盖与类对象相关的内容,您需要修改元类上的特殊方法。

class Meta(type):

    def __setattr__(self, attr, val):
        if attr == "frozen":
            print "You can't unfreeze the frozen"
        else:   
            cls.name = val

class Fixed(object):
        __metaclass__ = Meta
        ...