首先,property装饰器是通过数据描述符实现的。用法很简单,大家应该都知道,这里就不细说了。

这里主要分析一下property是如何通过描述符实现的。

class Property:
def __init__(self, fget):
self.fget = fget # 为实例增加方法,这里的方法是未绑定实例的,不会自动传入实例self
self.fset = None # 同上,未绑定实例 def __get__(self, instance, owner):
if instance is not None:
return self.fget(instance) # 调用原方法,传入实例self
return self def __set__(self, instance, value):
self.fset(instance, value) # 调用原方法,传入实例self和value def setter(self, func):
self.fset = func # 更新属性
return self class A:
def __init__(self, data):
self._data = data @Property # data = Property(data) 描述符实例
def data(self):
return self._data @data.setter # data = data.setter(data) 更新属性,并返回描述符实例
def data(self, value):
self._data = value

访问

a = A(100)
print(a.data) # 访问描述符实例,调用__get__()方法
# 100 执行过程如下:
1. 在装饰器中,data变量指向Property(func)描述符实例
2. 原data()函数被赋值给fget变量
3. a.data就是访问描述符实例,触发调用__get__()方法
4. 最后,调用fget()也就是原data()方法,并传入owner class的实例,亦即调用data(self)

赋值

a.data = 200  # 访问描述符实例,调用__set__()方法
print(a.data) # 访问描述符实例,调用__get__()方法
# 200 执行过程如下:
1. 在装饰器中,data变量指向data.setter(func)描述符实例。注意,后面的data是__get__()方法返回的描述符实例
2. 原data()函数被赋值给fset变量
3. 赋值操作触发调用__set__方法
4. 最后,调用fset也就是原data()方法,并传入owner class的实例和要赋的值,亦即调用data(self, value)

这里涉及到装饰器,需要对装饰器和面向对象有足够的了解才能弄明白当中的变量传递,希望你不会被挡住。

参考:

https://docs.python.org/3/library/functions.html#property

手动实现property装饰器的更多相关文章

  1. 浅尝装饰器--property装饰器

    [写在前面] 本帖归属于装饰器单元的学习,可以点击关键词'装饰器'查看其他博文讲解 [正文部分] property属性:将类方法用类属性的形式进行调用 class Good: def __init__ ...

  2. Python的property装饰器的基本用法

    Python的@property装饰器用来把一个类的方法变成类的属性调用,然后@property本身又创建了另一个装饰器,用一个方法给属性赋值.下面是在类中使用了@property后,设置类的读写属性 ...

  3. 面向对象之组合、封装、多态、property装饰器

    概要: 组合 封装 property装饰器 多态 Python推崇鸭子类型:解耦合,统一标准(不用继承) 1. 组合 继承:会传递给子类强制属性 组合:解耦合,减少占用内存.如:正常继承,如果一个班级 ...

  4. import导入模块,==和is,浅拷贝和深拷贝,进制转换,位运算,私有化,property装饰器

    '''import导入模块'''import sysprint(sys.path) sys.path.append('D://ASoft/Python/PycharmProjects')import ...

  5. property装饰器

    # 需要了解的property的用法 class People: def __init__(self,name): self.__name=name @property def name(self): ...

  6. 组合,多态与多态性,封装以及property装饰器介绍

    一:组合: 什么是组合:组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象. 为何要用组合:通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以间接地将两个类关联/整合/组合 ...

  7. Python10/24--组合/封装/property装饰器/多态

    组合的应用: 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合 '''class Foo: aaa=111 ...

  8. PYTHON-组合 封装 多态 property装饰器

    # 组合'''软件重用的重要方式除了继承之外还有另外一种方式,即:组合组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之 ...

  9. [转载]Python使用@property装饰器--getter和setter方法变成属性

    原贴:为什么Python不需要getter和setter getter 和 setter在java中被广泛使用.一个好的java编程准则为:将所有属性设置为私有的,同时为属性写getter和sette ...

随机推荐

  1. 2011 noip 提高组

    首先吐槽:刚刚写着写着突然蓝屏了,,emmm,写到最后一题了蓝屏了. 当时我的内心是崩溃的. 然后,旁边的大佬默默来了一句:论保存草稿的重要性. 连着蓝了三次之后开了防火墙,然后,,我左边那位同学又开 ...

  2. Linux文件下载(转)

    wget是Linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径 例如: # wget http://www.linuxsense.org/xxxx/xxx. ...

  3. 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--目录(8/8 完结)

    为什么要做这个 在使用nodejs开发过程中,总是发现需要做很多重复性的体力劳动,且因为自身是服务端程序员出身,感觉有一些服务端好的东西其实可以在nodejs上得到应用并能提高一些开发工作效率. 本系 ...

  4. django通用权限控制框架

    在web项目中根据不同的用户肯定会限制其不同的权限,利用以下模块可以满足日常几乎所有的权限控制 permission_hook.py  # 自定义权限控制,必须返回True/false  ,True表 ...

  5. SpringBoot笔记--FastJson

    FastJson配置 ObjectId class ObjectIdSerializer : ObjectSerializer { override fun write(serializer: JSO ...

  6. Mysql读写分离方案-Amoeba环境部署记录

    Mysql的读写分离可以使用MySQL Proxy,也可以使用Amoeba.Amoeba(变形虫)项目是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项 ...

  7. restfull环境搭建-helloword

    原文地址:http://blog.csdn.net/u013158799/article/details/39758341 1. REST和RESTful Web Services的简要说明 REST ...

  8. PAT甲级题解-1066. Root of AVL Tree (25)-AVL树模板题

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6803291.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  9. NEWBE CRALWER 产品需求文档

    1.产品概述 本产品是学霸软件系统的爬虫部分,由NEWBE团队负责.主要任务是从网上爬取出相关数据后提供给C705组使用. 2.产品的发展经历 2.1 产品的发展经历 本产品从2014.10.29开始 ...

  10. 使用nodejs去做一个验证码

    let express = require('express'); let captchapng = require('captchapng'); let app = express(); app.g ...