我想我应该扩大这个答案,现在我年纪大了,更聪明,知道发生了什么。迟到总比不到好。

您可以动态地向类添加属性。但是这是catch:你必须将它添加到类。

>>> class Foo(object):

... pass

...

>>> foo = Foo()

>>> foo.a = 3

>>> Foo.b = property(lambda self: self.a + 1)

>>> foo.b

4

属性实际上是一个简单的实现,称为descriptor.它是一个对象,为给定的属性,在给定的类提供自定义处理。 Kinda喜欢一种方式来考虑__getattribute__中一个巨大的if树。

当我在上面的例子中请求foo.b时,Python看到在类上定义的b实现了描述符协议 – 这意味着它是一个带有__get__,__set__或__delete__方法的对象。描述符声称负责处理该属性,所以Python调用Foo.b .__ get __(foo,Foo),并将返回值作为属性的值传递给你。在属性的情况下,每个这些方法只是调用fget,fset或fdel,传递给属性构造函数。

描述符是真正的Python的暴露其整个OO实现的管道的方式。事实上,还有另一种类型的描述符比属性更常见。

>>> class Foo(object):

... def bar(self):

... pass

...

>>> Foo().bar

>

>>> Foo().bar.__get__

谦逊的方法只是另一种描述符。它的__get__在调用实例上作为第一个参数;实际上,它做到这一点:

def __get__(self, instance, owner):

return functools.partial(self.function, instance)

无论如何,我怀疑这就是为什么描述符只工作在类:它们是一个正式的东西,首先强大的类。它们甚至是规则的例外:你可以明确地为一个类指定描述符,类本身是类型的实例!事实上,试图读取Foo.b仍然调用property .__ get__;它只是惯用于描述符在作为类属性访问时返回自身。

我认为这是非常酷,几乎所有的Python的OO系统可以用Python表示。

python 给类添加属性_python – 如何动态添加属性到类中?相关推荐

  1. 我的Python学习笔记(四):动态添加属性和方法

    一.动态语言相关概念 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C# ...

  2. python类的成员函数_Python实现动态添加类的属性或成员函数的解决方法

    某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法.用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块. 本文就此简述了Python实现动态添加类的属性或 ...

  3. Python面型对象--重载运算符与动态添加属性

    魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic methods).魔术方法在类 ...

  4. python 类静态属性_python面向对象之静态属性/静态方法/类方法/组合

    继续学习,不要松懈 #!/usr/bin/env python # coding:utf-8 class Campus: def __init__(self,name,addr,type): self ...

  5. python内置类属性_python常用内建属性大全

    在python中创建一个类,它不仅有我们自定义的属性和方法,还有与生俱来的一些属性和方法,我们叫它内建属性. 下面是类常用内建属性列表. __init__ 负责一个类实例化中的初始化操作 __new_ ...

  6. python 之属性_Python之对象的属性

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之对象的属性 #http://python.jobbole.com/82622/ #对象的属性 ...

  7. python中简述对象和类的关系_Python笔记-习题42 对象、类及从属关系

    1.研究一下为什么Python添加了这个奇怪的叫做object的类,它究竟有什么含义呢? A:Python中一切皆对象,创建的类皆以object为基类(父类),默认继承继承基类的属性和方法 Pytho ...

  8. neo4j 添加属性_Neo4j:动态添加属性/设置动态属性

    neo4j 添加属性 我一直在研究一个具有英国国家铁路时刻表的数据集,它们以文本格式为您提供每列火车的出发和到达时间. 例如,可以这样创建代表停止的节点: CREATE (stop:Stop {arr ...

  9. python增加一列数据_python数据怎么添加列?

    python在DataFrame数据中添加列的方法: 1.使用concat方法在数据中添加列 concat方法相当于数据库中的全连接(union all),它不仅可以指定连接的方式(outer joi ...

最新文章

  1. LeetCode简单题之距离顺序排列矩阵单元格
  2. SHELL-命令解释程序
  3. 5G将如何推动未来十年智能城市的发展
  4. 阿里达摩院员工业余打造“论文知识图谱”工具:极速搜索,完全可视化
  5. Servlet入门篇(GenericServlet 类 - HttpServlet 类 -ServletConfig 接口 - HttpServletRequest 接口……)
  6. redis和mysql实现原理_redis和mysql结合数据一致性方案
  7. Lichee (六) 优化配置的微内核
  8. 2014年中国新闻业年度观察报告
  9. python列表可以删除和修改吗_Python列表常见操作详解(获取,增加,删除,修改,排序等)...
  10. 总结 构造函数与非构造函数 原型继承的一个方法
  11. stylus之注释(Comments)
  12. 不规则炫彩创意渐变海报设计模板素材|带来十足的时尚感
  13. java camel swagger,Swagger将下划线转换为camelcase
  14. “一切即代码”究竟意味着什么?
  15. j2me游戏改成android,将j2me移植成android
  16. Java、JSP大学生助学贷款管理系统的设计与实现
  17. 2018年10微型计算机接口技术,微机原理及接口技术
  18. r语言如何计算t分布临界值_[统计]从p-value到q-value的计算(附代码)
  19. 微信公众号二维码怎么生成?好用的生成方法介绍
  20. 实用又方便电脑快捷键

热门文章

  1. 【Elasticsearch】 Full text queries query_string 等 字符串查询
  2. 【SpringCloud】Spring cloud Stream
  3. 【hortonworks/registry】NoClassDefFoundError: org/apache/zookeeper/Watcher
  4. 【Elasticsearch】es 增加 删除 节点
  5. 【Linux】Linux查看机器负载-IO负载
  6. hiveserver2的高可用HA
  7. 【jvm】jdk编译-未成功
  8. jmx监控之Dubbo
  9. 崩溃!如何面对令人脱发的老代码?
  10. 啥?不用安装Jre,SpringBoot项目也可以打包exe应用程序运行!