zoukankan      html  css  js  c++  java
  • property属性

    property属性的定义和调用注意点:
    • 定义时,在实例方法的基础上添加@property 装饰器;并且仅有一个self参数
    • 调用时,无需括号
        python的property属性的功能是:property属性内部进行一系列的逻辑运算,最终将计算结果返回。
     
    property属性的两种方式:
    • 装饰器 即:在方法上应用装饰器
    • 类属性 即:在类中定义值为property对象的类属性
        
        property装饰器在经典类中只有一种访问方式  @property。在新式类中有三种访问方式:
     1 class Goods:
     2     """python3中默认继承object类
     3         以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter  @xxx.deleter
     4     """
     5     @property
     6     def price(self):
     7         print('@property')
     8 
     9     @price.setter
    10     def price(self, value):
    11         print('@price.setter')
    12 
    13     @price.deleter
    14     def price(self):
    15         print('@price.deleter')
    16 
    17 # ############### 调用 ###############
    18 obj = Goods()
    19 obj.price          # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
    20 obj.price = 123    # 自动执行 @price.setter 修饰的 price 方法,并将  123 赋值给方法的参数
    21 del obj.price      # 自动执行 @price.deleter 修饰的 price 方法
    注意:
    • 经典类中的属性只有一种访问方式,其对应被@property 修饰的方法
    • 新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter 修饰的方法

    类属性方式,创建值为property对象的类属性:

    1 class Foo:
    2     def get_bar(self):
    3         return 'laowang'
    4 
    5     BAR = property(get_bar)
    6 
    7 obj = Foo()
    8 reuslt = obj.BAR  # 自动调用get_bar方法,并获取方法的返回值
    9 print(reuslt)

    property方法中有个四个参数

    • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
    • 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
    • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
    • 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息
     1 class Foo(object):
     2     def get_bar(self):
     3         print("getter...")
     4         return 'laowang'
     5 
     6     def set_bar(self, value): 
     7         """必须两个参数"""
     8         print("setter...")
     9         return 'set value' + value
    10 
    11     def del_bar(self):
    12         print("deleter...")
    13         return 'laowang'
    14 
    15     BAR = property(get_bar, set_bar, del_bar, "description...")
    16 
    17 obj = Foo()
    18 
    19 obj.BAR  # 自动调用第一个参数中定义的方法:get_bar
    20 obj.BAR = "alex"  # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入
    21 desc = Foo.BAR.__doc__  # 自动获取第四个参数中设置的值:description...
    22 print(desc)
    23 del obj.BAR  # 自动调用第三个参数中定义的方法:del_bar方法

    Property属性的应用:

      1.私有属性添加getter和setter方法:

     1 class Money(object):
     2     def __init__(self):
     3         self.__money = 0
     4 
     5     def getMoney(self):
     6         return self.__money
     7 
     8     def setMonet(self, value):
     9         if isinstance(value, int):
    10             self.__money = value
    11 
    12         else:
    13             print("error:不是整形数字")

      2.使用property升级getter和setter方法:

     1 class Money(object):
     2     def __init__(self):
     3         self.__money = 0
     4 
     5     def getMoney(self):
     6         return self.__money
     7 
     8     def setMoner(self, value):
     9         if isinstance(value, int):
    10             self.__money = value
    11 
    12         else:
    13             print("error:不是整形数字")
    14 
    15 
    16     # 定义一个属性,当对这个money设置值时调用setMoney,当获取值时调用getMoney
    17     money = property(getMoney, setMoner)
    18 
    19 
    20 a = Money()
    21 a.money = 100  # 调用setMoney方法
    22 print(a.money)  # 调用getMoney方法
      3.使用property取代getter和setter方法:
            重新实现一个属性的设置和读取方法,可以做边界判定
     1 class Money(object):
     2     def __init__(self):
     3         self.__money = 0
     4 
     5     # 使用装饰器对money进行装饰,那么会自动添加一个叫money的属性
     6     # 当调用获取money的值时,调用装饰器的方法
     7     @property
     8     def money(self):
     9         return self.__money
    10 
    11     # 使用装饰器对money进行装饰,那么会自动添加一个叫money的属性
    12     # 当调用修改money的值时,调用这个装饰器的方法
    13     @money.setter
    14     def money(self, value):
    15         if isinstance(value, int):
    16             self.__money = value
    17         else:
    18             print("error:不是整形数字")
    19 
    20 
    21 a = Money()
    22 a.money = 100
    23 print(a.money)
  • 相关阅读:
    只因写了一段爬虫,公司200多人被抓!
    中国顶级程序员图鉴
    漫画 | 外行对程序员误会有多深!
    关于深夜技术事故纪实录的若干问题回复
    富士康14跳被我赶上了,流水线车间真的没有梦想 | 十年系列
    祖国和我们小山村的希望
    互联网从此没有 BAT
    程序员,职场上请远离这种人!
    HTML5漂亮实用的电子书
    这个jQuery导航菜单怎么样
  • 原文地址:https://www.cnblogs.com/zzmx0/p/12735419.html
Copyright © 2011-2022 走看看