zoukankan      html  css  js  c++  java
  • python特性property

    通常,访问类和实例属性的时候,将返回所存储的相关值,也就是直接和类(实例的)的__dict__打交道。若果要规范这些访问和设值方式的话,

    一种方法是数据描述符,另一种就是python内置的数据描述符协议函数Property()。property是一种特殊的值,访问它时会计算它的值。

    特性的原型函数是property(getf=None,setf=None,delf=None,doc=None),函数的前三个参数分别对应描述符的__get__、__set__、__delete__方法。

    class Foo(object):
        def __init__(self,name):
            self._name=name
        def getname(self):
            return self._name
        def setname(self,value):
            self._name=value
        def delname(self):
            del self._name
        name=property(getname,setname,delname)
    

    这样就可以对属性进行读取、设置和删除了:

    >>> f=Foo('hello')
    >>> f.name
    'hello'
    >>> f.name='world'
    >>> f.name
    'world'
    >>> del f.name
    >>> f.name
    AttributeError: 'Foo' object has no attribute '_name'
    

    python2.6新增加了一个property装饰器,写起来更加的优雅。

    class Foo(object):
        def __init__(self,name):
            self._name=name
        @property
        def name(self):
            return self._name
        @name.setter
        def name(self,value):
            self._name=value
        @name.deleter
        def name(self):
            del self._name
    

    首先使用@property装饰器和相关方法将属性name设置为可读,后面的@name.setter和@name.deleter装饰器将其他方法与name属性上的设置和

    删除操作相关联。实际的name值存储在属性_name中。实际存储属性的名称无需遵循任何约定,只需要与特性名称不同即可。

    特性的使用遵循统一访问原则。如果没有特性,将会以简单属性的形式访问属性,而其他属性将以方法的形式访问。费力去了解何时添加额外的()会带来不必要的混淆。

    实际上,方法本身是作为一类特性被隐式处理的。

    class Foo(object):
        def __init__(self,name):
            self.name=name
        def spam(self,x):
            print '%s.%s'%(self.name,x)
    

    用户创建f=Foo('hello')这样的实例然后访问f.spam时,不会返回原始函数对象spam,相反会得到绑定方法。绑定方法有点类似于部分计算的函数,

    其中的self参数已经填入,但其他参数仍然需要在使用()调用该函数时提供。这种绑定方法是由在后台执行的特性函数静静地创建的。使用@staticmethod和

    @classmethod定义静态方法和类方法时,实际上就指定了使用不同的特性函数,以不同的方式处理对这些方法的访问。

  • 相关阅读:
    51 Nod 1068 Bash游戏v3
    51 Nod Bash 游戏v2
    51 Nod 1073 约瑟夫环
    UVA 12063 Zeros and ones 一道需要好好体会的好题
    51 Nod 1161 Partial sums
    2018中国大学生程序设计竞赛
    UVA 11971 Polygon
    UVA 10900 So do you want to be a 2^n-aire?
    UVA 11346 Possibility
    python with as 的用法
  • 原文地址:https://www.cnblogs.com/linxiyue/p/3857239.html
Copyright © 2011-2022 走看看