2014-02-26 1 views
1

ECMAScript 5 "frozen"객체에 비슷한 기능을 만들고 싶습니다. 아무 것도 변경할 수 없습니다. 그들은 인스턴스 부재로서 특성을 참조 할 때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 
     ... 
관련 문제