zoukankan      html  css  js  c++  java
  • Python高级笔记(六)-- property属性【重要】

    1. property属性

    目的:简化逻辑流程

    class Goods(object):
        @property
        def size(self):
            return 100
    
    obj = Goods()
    ret = obj.size   # 调用属性
    print(ret)

    //test2

    class Pager(object):
        def __init__(self, current_page):
            # 用户当前请求的页码(第一页,第二页....)
            self.current_page = current_page
            # 每页默认显示10条数据
            self.per_items = 10
    
        @property
        def start(self):
            val = (self.current_page - 1) * self.per_items
            return val
    
        @property
        def end(self):
            val = self.current_page * self.per_items
            return val
    
    
    p = Pager(1)
    print(p.start)    # 就是起始值,即 m
    print(p.end)      # 就是结束值,即 n

    2. property属性的两种方式

    • 装饰器 即:在方法上应用装饰器

    • 类属性 即:在类中定义值为property对象的类属性

    2.1 装饰器方法

    在类的实例方法上应用@property装饰器

    经典类,具有一种@property装饰器

    class Goods(object):
        @property
        def gname(self):
            return "douzi"
    
    obj = Goods()
    ret = obj.gname   # 自动执行 @property 修饰的price方法,并获取方法的返回值
    print(ret)

    新式类,具有三种@property装饰器

    @property

    @xxx.setter

    @xxx.deleter

    class Goods(object):
        """
        python3 里面才有 @xxx.setter, @xxx.deleter
        python2 里面只有 @property
        """
        @property
        def gname(self):
            return "@property"
    
        @gname.setter
        def gname(self, value):
            print("@gname.setter", value)
    
        @gname.deleter
        def gname(self):
            print("@gname.deleter")
    
    
    obj = Goods()
    ret = obj.gname      # 自动执行 @property 修饰的price方法,并获取方法的返回值
    print(ret)
    obj.gname = "cute"   # 自动执行 @gname.setter 修饰的price方法,并将 123 赋值给方法参数
    
    del obj.gname        # 删除obj名字
    @property
    @gname.setter cute
    @gname.deleter

    2.2 类属性方法,创建值为property对象的类属性

    当使用类属性的方式创建property属性时,经典类和新式类无区别 

    #!/usr/bin/python3 
    #-*- coding:utf-8 -*-
    
    class Foo(object):
        def get_bar(self):
            return "douzi"
    
        BAR = property(get_bar) 
    
    obj = Foo()
    res = obj.BAR  # 自动调用get_bar方法, 并获取方法的返回值
    print(res)

    property方法中有四个参数

    • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法

    • 第二个参数是方法名,调用 对象.属性 = xxx 时自动触发执行方法

    • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法

    • 第四个参数是字符串,调用 对象.属性.__doc__,此参数是该属性的描述信息

    #!/usr/bin/python3
    #-*- coding:utf-8 -*-
    
    class Foo(object):
        def get_bar(self):
            print("getter....")
            return "douzi"
    
        def set_bar(self, value):
            """必须两个参数"""
            print("setter....", value)
    
        def del_bar(self):
            print("deleter...")
            return "del value"
    
        BAR = property(get_bar, set_bar, del_bar, "description....")
    
    obj = Foo()
    res = obj.BAR  # 自动调用get_bar方法, 并获取方法的返回值
    print("getter....", res)
    
    obj.BAR = "dou zi"
    
    del obj.BAR
    
    print(Foo.BAR.__doc__)

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

    调用的方法可以通过各种逻辑处理

     #!/usr/bin/python3
     #-*- coding:utf-8 -*-
     
     class Money(object):
         def __init__(self):
             self.__money = 0
           
         def getMoney(self):
             return self.__money
       
         def setMoney(self, value):
             if isinstance(value, int):
                 self.__money = value
             else: 
                 print("error: 不是整型数字")
               
         # 定义一个属性,当对这个money设置值时调用setMoney,获取值时调用getMoney
         money = property(getMoney, setMoney)
       
       
     a = Money()
     a.money = 100   # 调用setMoney
     print(a.money)  # 调用getMoney

    新式类

    #!/usr/bin/python3
    #-*- coding:utf-8 -*-
    
    class Money(object):
        def __init__(self):
            self.__money = 0
    
        @property
        def Money(self):
            return self.__money
    
        @Money.setter
        def Money(self, money):
            if isinstance(money, int):
                self.__money = money
            else:
                print("error: 不是整型数字")
    
    a = Money()
    a.money = 100   # 调用setMoney
    print(a.money)  # 调用getMoney

  • 相关阅读:
    人月神话第二遍(总)--读书笔记
    Python实现人脸检测(个人、多人、视频)
    软件体系架构的质量属性
    jdk1.8 使用的是什么垃圾回收器?
    【深入理解Java虚拟机】垃圾回收
    P2167 [SDOI2009]Bill的挑战
    二项式反演基础
    P5039 [SHOI2010]最小生成树
    快速莫比乌斯/沃尔什变换 (FMT/FWT)
    莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/douzujun/p/10823178.html
Copyright © 2011-2022 走看看