zoukankan      html  css  js  c++  java
  • python中property简单使用与实现

    property简单使用

     1 class P:
     2     """
     3         property简单使用
     4     """
     5     def __init__(self,name):
     6         self._name = name
     7 
     8     @property
     9     def name(self):
    10         return self._name
    11 
    12     @name.setter
    13     def name(self,val):
    14         self._name = val
    15 
    16     @name.deleter
    17     def name(self):
    18         del self._name
    19 
    20 
    21 p = P("zhangsan")
    22 print(p.name)
    23 print(p.__dict__)
    24 p.name = "wangsi"
    25 print(p.name)
    26 print(p.__dict__)
    View Code

    结果:

    1 zhangsan
    2 {'_name': 'zhangsan'}
    3 wangsi
    4 {'_name': 'wangsi'}
    View Code

    property简单实现

     1 class Property:
     2 
     3     def __init__(self,fget=None,fset=None,fdel=None):
     4         self.fget = fget
     5         self.fset = fset
     6         self.fdel = fdel
     7         pass
     8 
     9     def __set__(self, instance, value):
    10         self.fset(instance,value)
    11         return self
    12 
    13     def __get__(self, instance, owner):
    14         if not instance:
    15             return self
    16         return self.fget(instance)
    17 
    18     def __delete__(self, instance):
    19         self.fdel(instance)
    20         return self
    21 
    22     def setter(self,fn):
    23         #保留设置函数的副本
    24         self.fset = fn
    25         return self
    26 
    27     def deleter(self,fn):
    28         # 保留删除函数的副本
    29         self.fdel = fn
    30         return self
    31 
    32 
    33 class Person:
    34 
    35     # d = Property()
    36     def __init__(self,data):
    37         self._data = data
    38 
    39     @Property   #等价式  data=Propery(data)
    40     def data(self):
    41         return self._data
    42 
    43     @data.setter   #等价式  data=data.setter(data)
    44     def data(self,val):
    45         self._data = val
    46 
    47     @data.deleter  #等价式  data=data.deleter(data)
    48     def data(self):
    49         del self._data
    50 
    51 
    52 p = Person(19)
    53 p.data = 123
    54 print(Person.__dict__)
    55 print(p.__dict__)
    56 del p.data
    57 print(Person.__dict__)
    58 print(p.__dict__)
    View Code

    结果:

    1 {'__init__': <function Person.__init__ at 0x0000015F3F0F0598>, '__dict__': <attribute '__dict__' of 'Person' objects>, 'data': <__main__.Property object at 0x0000015F3F0FE240>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__module__': '__main__', '__doc__': None}
    2 {'_data': 123}
    3 {'__init__': <function Person.__init__ at 0x0000015F3F0F0598>, '__dict__': <attribute '__dict__' of 'Person' objects>, 'data': <__main__.Property object at 0x0000015F3F0FE240>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__module__': '__main__', '__doc__': None}
    4 {}
    View Code

    注意:property 依赖装饰器和数据描述器实现

      数据描述器:需要实现__set__()方法和__get__()方法

      非数据描述器:需实现__get__()方法

  • 相关阅读:
    loj #143. 质数判定
    Quadratic Residues POJ
    P2155 [SDOI2008]沙拉公主的困惑
    P3868 [TJOI2009]猜数字
    P3704 [SDOI2017]数字表格
    P4449 于神之怒加强版
    P2568 GCD
    P1891 疯狂LCM
    loj#6229 这是一道简单的数学题
    P3768 简单的数学题 杜教筛+推式子
  • 原文地址:https://www.cnblogs.com/lanxiansen/p/10986932.html
Copyright © 2011-2022 走看看