当前位置 主页 > 网站技术 > 代码类 >

    通过实例了解python property属性

    栏目:代码类 时间:2019-11-01 15:05

    这篇文章主要介绍了通过实例了解python property属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    1. 什么是property属性

    一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法

    # ############### 定义 ###############
    class Foo:
      def func(self):
        pass
    
      # 定义property属性
      @property
      def prop(self):
        pass
    
    # ############### 调用 ###############
    foo_obj = Foo()
    foo_obj.func() # 调用实例方法
    foo_obj.prop # 调用property属性

    如下的例子用于说明如何定一个简单的property属性:

    class Goods(object):
        @property
        def size(self):
            return 100 
    g = Goods()
    print(g.size)

    property属性的定义和调用要注意一下几点:

    定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数 调用时,无需括号

    2. 简单的实例

    对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据 这个分页的功能包括:

    根据用户请求的当前页和总数据条数计算出 m 和 n 根据m 和 n 去数据库中请求数据
    # ############### 定义 ###############
    class Pager:
      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)
    p.start # 就是起始值,即:m
    p.end # 就是结束值,即:n

    从上述可见:

    Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回。

    3. property属性的有两种方式

    装饰器 即:在方法上应用装饰器 类属性 即:在类中定义值为property对象的类属性

    3.1 装饰器方式

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

    Python中的类有经典类和新式类,新式类的属性比经典类的属性丰富。( 如果类继object,那么该类是新式类 )

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

    # ############### 定义 ###############  
    class Goods:
      @property
      def price(self):
        return "laowang"
    # ############### 调用 ###############
    obj = Goods()
    result = obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
    print(result)

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

    #coding=utf-8
    # ############### 定义 ###############
    class Goods:
      """python3中默认继承object类
        以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter @xxx.deleter
      """
      @property
      def price(self):
        print('@property')
    
      @price.setter
      def price(self, value):
        print('@price.setter')
    
      @price.deleter
      def price(self):
        print('@price.deleter')
    
    # ############### 调用 ###############
    obj = Goods()
    obj.price     # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
    obj.price = 123  # 自动执行 @price.setter 修饰的 price 方法,并将 123 赋值给方法的参数
    del obj.price   # 自动执行 @price.deleter 修饰的 price 方法