我想为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 = {}
以与其他作业相同的方式失败?为什么不呢?
答案 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
...