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

原文地址:https://www.cnblogs.com/douzujun/p/10823178.html