2017-06-14 75 views
0

最近,我讀的書「學習蟒蛇」。在這本書中,它使用描述模擬特性如下:在蟒蛇:如何使用描述符來模擬性能

class Property: 
    def __init__(self, fget=None, fset=None, fdel=None, doc=None): 
     self.fget = fget 
     self.fset = fset 
     self.fdel = fdel # Save unbound methods 
     self.__doc__ = doC# or other callables 
    def __get__(self, instance, instancetype=None): 
     if instance is None: 
     return self 
     if self.fget is None: 
     raise AttributeError("can't get attribute") 
     return self.fget(instance) # Pass instance to self 
    def __set__(self, instance, value): 
     if self.fset is None: 
     raise AttributeError("can't set attribute") 
     self.fset(instance, value) 
    def __delete__(self, instance): 
     if self.fdel is None: 
      raise AttributeError("can't delete attribute") 
     self.fdel(instance) 

最後,它說:「...我們必須用setter和deleter方法來擴展我們的Property類,這會節省裝飾的存取函數並返回屬性對象(self應該足夠了)。由於內置屬性已經做到了,所以我們這裏將省略這個擴展的正式編碼。「 ? 我的問題是如何實現的「二傳手」的裝飾和「刪除器」裝飾我不知道

+0

也許嘗試一些事情後才張貼在這裏。 – Ludisposed

回答

1

添加方法,您Property類:

class Property: 
    ... 
    def setter(self, f): 
     self.fset = f 
     return self 

    def deleter(self, f): 
     self.fdel = f 
     return self 

這些簡單地採取功能和改變的相應屬性Property。這些然後可以用作例如

class some_thing(object): 
    @Property 
    def some_property(self): 
     ... 

    @some_property.setter 
    def set_some_property(self, x): 
     ... 

    @some_property.deleter 
    def del_some_property(self): 
     ... 
+0

非常感謝! – Jay