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

2024-04-27 04:50:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一个类似于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 = {}

和其他作业一样失败?为什么不呢?


Tags: thenameselfyoudefval特性can
1条回答
网友
1楼 · 发布于 2024-04-27 04:50:38

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

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
        ...

相关问题 更多 >