2011-08-01 2 views
2

파이썬 프로퍼티를 순수 파이썬 구현체로 구현하여 초기화 작업을 이해하고 있습니다. 설명자 인터페이스 (, )를 다루는 많은 사람들이 있지만 setter 또는 deleter 메소드에 대해서는 설명하지 않았습니다. this (대략) 구현 방법입니까?setter로 파이썬 커스텀 프로퍼티

답변

1

속성은 간단하고 직설적 인 설명 자입니다. 설명자 프로토콜은 __get__, __set____delete__의 세 가지 방법으로 구성됩니다. 이러한 각 작업의 속성은 단순히 사용자 제공 함수를 호출합니다.

class my_property(object): 
    def __init__(self, getter, setter, deleter): 
     self.getter = getter 
     self.setter = setter 
     self.deleter = deleter 

    def __get__(self, instance, owner): 
     return self.getter(instance) 

    def __set__(self, instance, value): 
     self.setter(instance, value) 

    def __delete__(self, instance): 
     self.deleter(instance) 

class Foo(object): 
    def __init__(self): 
     self._x = 42 

    def get_x(self): 
     print 'getter' 
     return self._x 

    def set_x(self, value): 
     print 'setter' 
     self._x = value 

    def del_x(self): 
     print 'deleter' 
     del self._x 

    x = my_property(get_x, set_x, del_x) 

obj = Foo() 
print obj.x 
obj.x = 69 
del obj.x 
print obj.x 
+0

setter 메서드 (property.setter)가 구현되는 방식에 관심이 있습니다. – Hernan

+0

@Hernan :'fset'을 변경하고'self'를 반환합니다 (또는 아마도 그 자체의 복사본을 반환합니다, 나는 정말로 기억하지 않습니다). 로켓 과학 관련 없음. –

+0

그게 내가 생각한,하지만 내가 게시물에 넣은 속성에서 서브 클래 싱하고 __init__ (args, kwargs) 인쇄를 추가 한 클래스의 작업을보고 링크를 다시 속성을 만드는 것 같다 , 단지 fset을 변경하는 것이 아닙니다. 이게 사실인가요? 왜 그런가요? – Hernan

0

의견 : 파이썬 목록 개체에 속성을 추가하는 간단한 방법이 있습니다. 한 무리의 워프.

>>> class Foo(list): pass 
>>> l = Foo([1,2,3]) 
>>> l.foo = 'bar' 
>>> l 
[1, 2, 3]