2014-02-26 47 views
1

我想製作一個與ECMAScript 5「凍結」對象類似的功能,您無法在其上更改任何內容。Python描述符不掛鉤類級別屬性

這樣做:

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 = {}

失敗以同樣的方式在其他任務沒有?爲什麼不呢?

回答

2

您需要覆蓋Metaclass的__setattr__。 Metaclass是創建類的類(類似於由類創建的實例),因此,要覆蓋與類對象相關的事情,您需要修改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 
     ...