`
把酒泯恩仇
  • 浏览: 27289 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

你懂PYTHON吗【谈PYTHON中的数据模型】值得一看

阅读更多

 

今天,谈谈python中的数据模型,当然你可以不了解这些东西,照样可以写出漂亮的python代码,但是“知其然知其所以然”是我的作风,总是不明白python的一些机制,心里很不爽。结合python的doc和一篇文章,差不多明白了python的哲理。

我觉得有必要将python中的文档的一些重要语句拿出来。

Objects are Python’s abstraction for data. All data in a Python program is represented by objects or by relations between objects.
Every object has an identity, a type and a value.

为什么我这里要强调这里的对象,有对象以为着有一些属性(函数也罢,变量也罢都是属性)与之关联,你操作一个对象,其实就是在和这些属性打交道。

在这里,我集中在python中的类,去弄明白python中的类究竟是怎么完成其功能的.
A class has a namespace implemented by a dictionary object. Class attribute references are translated to lookups in this dictionary.

这句话很重要,一个类有其自己的namespace(命名空间),而且这个命名空间的实现本质上是一个字典。换句话说,你对一个类的操作其实就是在对这个“特殊”的字典进行操作,那么怎么去区分类的实例和类呢,其实在python中,类的实例也有一个字典,去记录该实例的属性。

  1. class T(object):  
  2.     age = 21  
  3.   
  4. t = T()  
  5. t.name = "ilovebaiyang"  
  6.   
  7. print "dir(T):", dir(T)  
  8. print "dir(t):", dir(t)  

这个打印的结果是:

  1. dir(T): ['__class__''__delattr__''__dict__''__doc__''__format__''__getattribute__''__hash__''__init__''__module__''__new__''__reduce__''__reduce_ex__''__repr__''__setattr__''__sizeof__''__str__''__subclasshook__''__weakref__''age']  
  2.   
  3. dir(t): ['__class__''__delattr__''__dict__''__doc__''__format__''__getattribute__''__hash__''__init__''__module__''__new__''__reduce__''__reduce_ex__''__repr__''__setattr__''__sizeof__''__str__''__subclasshook__''__weakref__''age''name']  

其中有些属性是从object上继承来的,比如__doc__, __setattr__,__dict__等等,其中值得注意的是自定义属性,age和name,他们分别存在于类T中和类T的实例t中,那么为什么在dir(t)中出现了age的属性呢,原因是从它的类上复制过来的,而且如果我们打印他们的id,其实他们的id是一样的。在这里,我们出现了一个疑问,前面提到的命名空间的字典就是dir()函数产生的字典么,看上去貌似是,因为它的确记录了该对象的所有属性,其实这个是错误的,原因我们就要回到dir函数上了,它的作用是罗列出当前对象的所有属性,包括父类的。其实,前面提到的命名空间是的__dict__成员,所有与该对象对应的属性全部放在这个字典里。

我们打印出来看看

  1. T.__dict__:  {'__dict__': , '__module__''__main__''__weakref__': , 'age'21'__doc__'None}  
  2.   
  3. t.__dict__:  {'name''ilovebaiyang'}  

这一下才会和我们想象的一样,name属性只存在实例中。
接下来是属性的查找:
如果我们要打印t.age,怎么搜索

  • 1.先查找该实例的__dict__,如果有,返回,否则进行第二步
  • 2.查找类的__dict__,如果有返回,没有的话,继续查找该类的父类,直到基类,如果还没有,抛出异常。

当然,其实python中的查找还做了很多其他事,特别是一些隐含的调用,如果我们重写这些隐含的调用,就可以写出符合我们的数据。
看下面的例子:

  1. class T(object):  
  2.     def __setattr__(self, name, value):  
  3.         print "__setattr__ called "  
  4.         object.__setattr__(self, name, value)  
  5.   
  6.     def __getattr__(self, name):  
  7.         print "__getattr__ called "   
  8.   
  9.     def __getattribute__(self, name):  
  10.         print "__getattribute__ called"  
  11.         return object.__getattribute__(self, name)  
  12.   
  13. t = T()  
  14. t.name = "baiyang"  
  15. print "t", t.name  
  16. t.baiyang  

结果:

  1. __setattr__ called  
  2. t __getattribute__ called  
  3. baiyang  
  4. __getattribute__ called  
  5. __getattr__ called  

分析以上的结果,当t.name被执行时,先调用了__setattr__函数;当print “t”, t.name时,调用了__getattribute__函数;当t.baiyang时,调用了__getattr__函数,因为t没有baiyang这个属性,故调用这个函数。

其实简单的想一下,会明白,我们在操作namespace这个字典时,我们都会隐式的调用相应的函数,这些函数可以用来进行数据的验证。
总结一下,在操作类的实例的属性时,我们需要关注一下函数:
object.__setattr__(self, name, value)
object.__getattr__(self, name)
object.__delattr__(self, name)
object.__getattribute__(self, name)

其中你对任何对象的属性访问时,都会隐式的调用__getattribute__方法,比如你调用t.__dict__,其实你执行了t.__getattribute__(“__dict__”)函数。

神奇的python,把字典用的如此灵活,由此可以看出字典在python的地位是何其的重要。

在这里,我们或许想到了怎么不去隐式的调用这些函数,对,我们可以直接去操作类或者类实例的__dict__。看看下面的例子:

  1. class T(object):  
  2.     age = 21  
  3.     def __setattr__(self, name, value):  
  4.         print "__setattr__ called "  
  5.         object.__setattr__(self, name, value)  
  6.   
  7.     def __getattr__(self, name):  
  8.         print "__getattr__ called "   
  9.   
  10.     def __getattribute__(self, name):  
  11.         print "__getattribute__ called"  
  12.         return object.__getattribute__(self, name)  
  13.   
  14. t = T()  
  15. t.__dict__["name"] = "baiyang"  
  16. print "t.__dict__: ", t.__dict__["name"]  
  17. print "t.age: ", t.age  
  18. print "t.__dict__['age']: ", t.__dict__["age"]  

结果

  1. __getattribute__ called  
  2. t.__dict__:  __getattribute__ called  
  3. baiyang  
  4. t.age:  __getattribute__ called  
  5. 21  
  6. t.__dict__['age']:  __getattribute__ called  
  7.   
  8. Traceback (most recent call last):  
  9.   File "C:\Users\Administrator\Desktop\lab\SogouW\Freq\test.py", line 18in  
  10.     print "t.__dict__['age']: ", t.__dict__["age"]  
  11. KeyError: 'age'  

我们来分析一下:
1.t__dict__["name"] = “baiyang”其中调用了__getattribute__函数,因为__dict__本身也是一个属性的,所以它必须会执行的;但是你会发现此时__setattr__并没有执行,达到了我们想要的效果;
2.print “t.age: “, t.age
print “t.__dict__['age']: “, t.__dict__["age"]这才是重点,第二条语句抛出了KeyError的异常,再一次证明了age只是存在于类的namespace中。

最后,我们与python中的descriptor进行比较:
可以看这篇文章,我就不细讲了。
主要一点就是descriptor对应的函数是
object.__get__(self, instance, owner)
object.__set__(self, instance, value)
object.__delete__(self, instance)
可以看出少了attr这个词,也以为着我们必须将他们区分看。descriptor是对类的实例进行的操作,内建函数property()就是通过这个方式实现的。看了此文,是不是对python的工作机制更加了解了呢?
好了,在这里提几个问吧,你可以去网上搜到答案

  • 如何创建immutable的数据,我之前的一篇文章已经给出了答案。
  • 如何创建singleton模式的数据

如果你明白了上面的文章,你就会明白,不论你想写出什么样的数据,只要去重写python中一些内在的函数即可。

 

-----------------打造高质量的文章 更多关注 把酒泯恩仇---------------

为了打造高质量的文章,请  推荐  一个吧。。。。谢谢了,我会写更多的好文章的。

请关注sina微博:http://weibo.com/baiyang26

把酒泯恩仇官方博客:http://www.ibaiyang.org 【推荐用google reader订阅】

把酒泯恩仇官方豆瓣:http://www.douban.com/people/baiyang26/

3
1
分享到:
评论

相关推荐

    python实现BP神经网络回归预测模型

    神经网络模型一般用来做分类,回归预测模型不常见,本文基于一个用来分类的BP神经网络,对它进行修改,实现了一个回 归模型,用来做室内定位。模型主要变化是去掉了第三层的非线性转换,或者说把非线性激活函数...

    基于无人机航拍数据的三维场景重建python源码+项目说明+模型+数据.zip

    基于无人机航拍数据的三维场景重建python源码+项目说明+模型+数据.zip 基于无人机航拍数据的三维场景重建python源码+项目说明+模型+数据.zip 基于无人机航拍数据的三维场景重建python源码+项目说明+模型+数据.zip ...

    基于的BERT的文本纠错模型python源码+项目说明+数据集+详细注释.zip

    基于的BERT的文本纠错模型python源码+项目说明+数据集+详细注释.zip 基于的BERT的文本纠错模型python源码+项目说明+数据集+详细注释.zip 基于的BERT的文本纠错模型python源码+项目说明+数据集+详细注释.zip 基于的...

    【项目实战】Python实现基于LDA主题模型进行电商产品评论数据情感分析

    《Python实现基于LDA主题模型进行电商产品评论数据情感分析》 该项目实战旨在利用Python编程语言,结合LDA(Latent Dirichlet Allocation)主题模型,对电商产品评论数据进行深度的情感分析。LDA是一种无监督机器...

    casa模型的python实现,cass建模,Python

    在本项目中,开发者利用Python实现了CASA模型,使得研究人员可以通过编写代码的方式,方便地进行NPP的计算,无需手动进行繁琐的数据处理和运算。 首先,我们来了解一下Python在CASA模型中的应用。Python提供了许多...

    python基于ARIMA时间序列的销量预测模型全部数据.zip

    python基于ARIMA时间序列的销量预测模型全部数据.zipARIMA模型提供了基于时间序列理论,对数据进行平稳化处理(AR和MA过程)、模型定阶(自动差分过程)、参数估计,建立模型,并对模型进行检验。 在Python中...

    基于Python英超足球赛的数据采集和预测,包括数据集

    在IT行业中,数据分析和预测是极其重要的一环,特别是在体育赛事如英超足球比赛中...通过深入研究和实践,初学者能够提升Python编程技能,掌握数据处理和预测模型建立的方法,为将来在更复杂的数据分析项目中奠定基础。

    15.时间序列预测(LSTM模型)python代码实现

    时间序列预测是数据分析领域中的一个重要话题,特别是在诸如股票市场预测、销售趋势分析、天气预报等应用场景中。长短期记忆网络(LSTM)是深度学习中一种适用于处理序列数据的递归神经网络,特别适合时间序列预测。...

    基于模型的协同过滤电影评分预测模型_springsnc_python预测_python_协作编辑Python_预测模型_

    在本项目中,我们主要探讨的是一个基于模型的协同过滤电影评分预测模型,该模型是用Python编程语言实现的。协同过滤是一种广泛应用于推荐系统的技术,它通过分析用户的历史行为来预测他们对未评价物品的可能喜好。在...

    一个Python包,用于使用分段任意模型(SAM)分割地理空间数据

    分段任意模型(Segmented Arbitrary Model,简称SAM)是一种在地理空间数据分析中用于分割和分类数据的有效方法。这个Python包专门为此目的而设计,允许用户通过编程方式高效地对地理空间数据进行分割。 Python作为...

    Python源码集锦-心血管预测模型数据+代码

    此外,代码中可能还涉及数据读取(pandas库)、数据存储(pickle、csv等格式)、模型保存和加载(joblib库)等操作,这些都是Python在数据科学中的基础技能。 总的来说,这个资源包提供了一个实际的案例,用于学习...

    lppl模型_lppl_LPPL模型_python_

    在Python中实现LPPL模型,我们需要引入相关的数据分析和建模库,如NumPy、Pandas和SciPy等。首先,数据预处理是关键,这包括获取历史股票价格数据,清洗数据,去除异常值,并将其转换为合适的时间序列格式。Pandas库...

    python在水文中的应用

    * 模拟:Python 可以用于水文领域中的模拟,例如水文模型、水质模型、气象模型等。 * 可视化:Python 可以用于水文领域中的可视化,例如数据可视化、图形可视化、地图可视化等。 * 自动化:Python 可以用于水文领域...

    Python-使用预训练语言模型BERT做中文NER

    "Python-使用预训练语言模型BERT做中文NER" 这个标题指出我们将探讨如何在Python环境中利用预训练的BERT模型进行中文命名实体识别(NER)。BERT,全称为Bidirectional Encoder Representations from Transformers,...

    mmd工具python驱动mmd模型运动以及模型数据.zip

    mmd工具python驱动mmd模型运动以及模型数据

    Python脑电数据处理中文手册1

    总的来说,【Python脑电数据处理中文手册1】是一本面向初学者的实用教程,旨在降低Python在EEG分析中的学习门槛,推动更多研究者利用Python进行高效的数据处理和分析。通过这本书,读者不仅能学会具体的操作步骤,还...

    Python数据分析与应用:从数据获取到可视化

    Python数据分析与应用是一个涵盖多个领域的综合主题,包括数据获取、数据清洗、数据分析、数据可视化以及相关的编程技巧。在这个领域,Python以其简洁易读的语法和丰富的库支持,成为了数据科学界的首选工具。以下是...

    Python-Causality是一款数据集因果分析工具

    Python-Causality是一款专为数据集进行因果分析的工具,旨在帮助用户在处理大量数据时探索和理解变量之间的因果关系。因果分析是统计学和机器学习领域中的一个重要部分,它不仅仅关注相关性,而是深入探究变量间的...

    Python-基于FreeCAD实现的一整套建筑信息模型BIM工具

    3. **数据管理**:Python可以处理BIM模型中的元数据,包括属性信息和参数。这有助于创建和维护项目的结构化信息。 4. **数据可视化**:Python的Matplotlib、Plotly或Mayavi库可以用于将BIM数据转换为可视化图形,...

Global site tag (gtag.js) - Google Analytics