通过描述符自定制@property的功能

# 通过描述符自定制@property的功能

# 原始通过@property实现的功能:将类中定义的函数属性,通过装饰器@property将其封闭成数据属性

class Room:
    def __init__(self, name, width, length):
        self.name = name
        self.width = width
        self.length = length

    @property
    def area(self):
        return self.width * self.length

r1 = Room(‘厨房‘, 10, 4)
print(r1.area)

# 通过描述符与装饰器自定制@property的功能

class Lazyproperty:  # 定义描述符的类
    def __init__(self, func):  # 初始化时接收传入的方法进行保存
        self.func = func

    def __get__(self, instance, owner):
        if instance is None:    # 解决直接用类调用属性时传不了实例而报错的问题
            return self
        res = self.func(instance)
        setattr(instance, self.func.__name__, res)  # 将res放入实例的字典中,如果下次再调用,根据优先级实例属性高于非数据描述符,实例的属性字典中有就直接从实例的属性字典中找了
        return res  # 返回实例对象调用父类方法的结果,instance代表实例

class Room2:
    def __init__(self, name, width, length):
        self.name = name
        self.width = width
        self.length = length

    @Lazyproperty   # area=Lazyproperty(area) 使用装饰器的这一步就相当于对area属性指定了描述符,给Room2添加了一个类属性
    def area(self):
        return self.width * self.length

r2 = Room(‘厨房‘, 10, 4)
# 实例调用area
print(r2.area)  # 从r2中先找有没有area属性,没有从父类Room2中找,找到后发现是非数据描述符,就触发了__get__方法
# 类调用area
print(Room2.area)   # 由于__get__方法的接收参数需要一个实例,这里是用类调用的,所以会传None过去,因此会报错

原文地址:https://www.cnblogs.com/dangrui0725/p/9471820.html

时间: 2024-11-09 06:04:57

通过描述符自定制@property的功能的相关文章

利用描述符自定制property

1 class property2: 2 def __init__(self, func): 3 print('执行property2') 4 self.func = func 5 6 def __get__(self, instance, owner): 7 return self.func(instance) 8 9 10 class Room: 11 def __init__(self, name, width, length): 12 self.name = name 13 self.w

Python进阶-----自定制property

一.回顾python内置的装饰器@property @property的作用就是将类的函数属性同对象的数据属性一样可供对象直接调用(静态属性),而不需要加() 1 class Room: 2 def __init__(self,name,width,length): 3 self.name = name 4 self.width = width 5 self.length = length 6 7 @property #这个装饰器可以使得Room实例化的对象直接调用area这个函数属性 8 de

课时46:魔法方法:描述符(property的原理)

目录: 一.描述符(property的原理) 二.课时46课后习题及答案 ********************************** 一.描述符(property的原理) ********************************** 本节要讲的内容叫作描述符,用一句话解释,描述符就是将某种特殊类型的类的实例指派给另一个类的属性.那什么是特殊类型的类呢?就是至少要在这个类里边定义__get__().__set__()或__delete__()三个特殊方法中的任意一个. 下表列举了

转载python描述符介绍

来源:http://www.ibm.com/developerworks/cn/opensource/os-pythondescriptors/ 简介 Python 2.2 引进了 Python 描述符,同时还引进了一些新的样式类,但是它们并没有得到广泛使用.Python 描述符是一种创建托管属性的方法.除了其他优点外,托管属性还用于保护属性不受修改,或自动更新某个依赖属性的值. 描述符增加了对 Python 的理解,改善了编码技能.本文介绍了描述符协议,并演示了如何创建和使用描述符. 描述符协

描述符简介

请给作者点赞-->原文链接 简介 Python 描述符是一种创建托管属性的方法.除了其他优点外,托管属性还用于保护属性不受修改,或自动更新某个依赖属性的值. 描述符增加了对 Python 的理解,改善了编码技能.本文介绍了描述符协议,并演示了如何创建和使用描述符. 描述符协议 Python 描述符协议 只是一种在模型中引用属性时指定将要发生事件的方法.它允许编程人员轻松.有效地管理属性访问: set get delete 在其他编程语言中,描述符被称作 setter 和 getter,而公共函数

python描述符descriptor(二)

python内置的描述符 python有些内置的描述符对象,property.staticmethod.classmethod,python实现如下: class Property(object): def __init__(self,getf,setf,delf,doc): self.getf=getf self.setf=setf self.delf=delf self.doc=doc def __set__(self,instance,own=None): if instance is N

Python__new__方法、定制属性访问、描述符与装饰器

__new__方法的运行顺序 装饰器的概念的用法 三个内置装饰器 类中属性的访问过程 __new__方法 创建实例的方法 __new__方法是在类创建实例的时候自动调用的 实例是通过类里面的__new__方法创建出来的 先调用__new__方法创建实例,再调用 __init__方法初始化实例 __new__方法,后面括号里的cls代表的是类本身 必须有返回值 父类名.__new__(cls) 单例模式 创建多个实例的时候,每个实例所指向的内存地址不同 单例模式让多个实例引用的是同一个实例,是一个

python描述符、property、函数(类)装饰器实例解析

1 import sys 2 3 ''' 4 当使用实例对象访问属性时,都会调用__getattribute__内建函数 5 __getattribute__查找属性的优先级 6 1.类属性 7 2.数据描述符 8 3.实例属性 9 4.非数据描述符 10 5.__getattr__() 11 12 #实例.属性 13 c.x ==>type(x).__dict__['x'].__get__(x,type(x)) 14 #类.属性 15 C.x ==>X.__dict__['x'].__get

property ,classmethod的来历-描述符

我在想怎么让一个属性只读,这让我想起来了classmethod,都知道classmethod就是只能让类来调用,所以呢,这里它们都用到一个东西描述符. 1描述符有两种: 1)数据描述符,实现了__get__和__set__的类. 2)非数据描述符,只实现了__get__的类. 2,实例查找属性的顺序链,ex,obj = EX(),在访问obj.attr的时候, 1)如果attr存在是数据描述符且存在于EX或者其父类中,则直接返回. 2)如果attr存在是属性且存在于obj或者其父类中,则直接返回