文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>python中的描述符

python中的描述符

时间:2006-07-09  来源:pipehappy

一般的得到一个类或是一个实例的属性的方法是从类或是实例的__dict__中查找。这样属性 可以做的事情会因为这种方式而得到限制(他们仅仅是一个data,或是第一个默认参数是所属 实例的方法)。为了提供更大的弹性,就有了描述符descriptors。   在这种体制中,主类(owner class)有方法是描述符定义的。   他们定义了三个接口: __get__(self, instance, owner) __set__(self, instance, value) __delete__(self, instance) instance是owner class的一个实例,owner是owner class名。   如果实现了__get__和__set__就是一个data描述符,如果只有__get__就是一个non-data 描述符。不同的效果在于data描述符总是替代在一个实例中的实现,而non-data描述符可以 在实例中改变。当然如果仅仅在__set__中raise AttributeError,仍然得到的是一个 non-data的描述符。   几个python中自建的方法的利用描述符体制的python实现。 property: class Property(object):
    def __init__(self, get=None, set=None, del=None, doc=None):
        self.get = get
        self.set = set
        self.del = del
        self.__doc__ = doc
    def __get__(self, obj, klass=None):
        if obj is None:
            return self
        if self.get is None:
            raise AttributeError
        return self.get(obj)
    def __set__(self, obj, value):
        if self.set is None:
            raise AttributeError
        self.set(obj, value)
    def __delete__(self, obj):
        if self.del is None:
            raise AttributeError
        self.del(obj)
staticmethod: class StaticMethod(object):
    def __init__(self, f):
        self.f = f
    def __get__(self, obj, klass=None):
        return self.f
classmethod: class ClassMethod(object):
    def __init__(self, f):
        self.f = f
    def __get__(self, obj, klass=None):
        if klass is None:
            klass = type(obj)
        def newfunc(*args):
            return self.f(klass, *args)
        return newfunc
相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载