python属性

<1>属性包装:将方法包装成属性,以隐藏相关的现实,进而控制属性的类型或范围;是虚拟的属性

外界访问时就可以像访问类属性一样使用点(.)的方式

<2>属性包装的三种操作:

  <1>@property

  <2>@property_name.setter

  <3>@property_name.deleter

例子:

  class Person:

      def __init__(self, name="seven", age=None):

              self._name = name

         self.age = age 

            @property

            def name(self):

        return self.name

           @name.settter

   def name(self, name):

                  if 0 < name <=18:

                       self._name = name

                  else:

                      print("errors!")

        if __name__ == '__main__':

       p = Person()

            print(p.name)

<3>__call__():让类的实例像方法一样可调用

class Pepole:

    def __call__(self):

    print("call")

if __name__ == '__main__':

     p = Person()

  p()

<4>描述符

将实现特殊协议方法的类作为另外一个类的类属性,用来拦截和控制属性访问并可以重复利用

协议方法:

  __get__()

    __set__()

      __delete__()

分类:

  数据描述:实现了全部的协议方法

  非数据描述:实现部分的协议方法

  说明:所有的类成员函数都是非数据描述,因为类成员函数只实现了协议方法中的一种

  同名的实例属性和非数据描述符(以方法为例,会覆盖方法)访问的优先级

note:这只能在新式类中使用

class Person:

  def __init__(self, defautl=0):

    self.default = default

  def __get__(self, instance, owner):

    return self.defautl

  def __set__(self, instance, val):

    if val > 0:

      self.default = val

    else:

      print("done")

  def __delete__(self, instance):

    pass

 

class Score:

  core = Person()

  cores = Person()

if __name__ == '__main__':

  s = Score()

  print(s.core)

  print(s.cores)

  s.cores = 2

  print(s.cores)

  s.core = -2

  print(s.core)

 

posted @ 2017-01-19 23:42  seven95  阅读(572)  评论(0编辑  收藏  举报