这个问题得深入python源码才能看。

 class a:
pass
aa =a()
print dir(aa)#aa只有doc和module属性
print aa.__class__#__main__.a

2.关于os.path和posixpath

以下一段话引用自某网友:

我们可以从sys.modules中找到当前已经加载的模块,sys.modules是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入。

最后一句话很关键,该字典决定了导入模块时是否需要重新导入,也就是说,python解释器是参考这个字典来决定导入模块时要不要重新导入。而且导入新模块的同时,将新模块加入该字典。

还有,可用模块的__file__属性查看模块文件的位置

以上两点是需要知道的,下面说问题:

用sys.modules可查看到,(qpython安卓版)

'os.path':<module 'posixpath' from '/data/user/0/com.hipipal.qpyplus/files/lib/python27.zip/posixpath.py'>

'posixpath':<module 'posixpath' from '/data/user/0/com.hipipal.qpyplus/files/lib/python27.zip/posixpath.py'>

'os':<module 'os' from '/data/user/0/com.hipipal.qpyplus/files/lib/python27.zip/os.py'>

可以看到,os是模块而不是那种包含很多模块的文件夹。

而os.path模块就是posixpath模块。这是怎么做到的呢?我猜想,应该是os.py源文件中,有这样一行代码,import posixpath as path

下面我们做个实验验证一下猜想。

c.py

 print "haha"
def cc():
print "haha"

a.py

 import c as b
b.cc()

test.py

 import a
a.b.cc()
import sys
print sys.modules['a']
print sys.modules['c']
print sys.modules['a.b']

将以上仨文件保存,然后运行test.py,下面是运行结果:

haha

haha

haha

<module 'a' from '/storage/emulated/0/qpython/scripts/a.py'>

<module 'c' from '/storage/emulated/0/qpython/scripts/c.py'>

Traceback (most recent call last):

File "/storage/emulated/0/qpython/scripts/test.py", line 7, in <module>

print sys.modules['a.b']

KeyError: 'a.b'

可以看到,a.b等同于c模块,b在a中是c模块的别名,我们可以用a.b来调用c模块的属性和方法。就如同,os.path等同于posixpath模块。

但是最终的问题来了,为什么在字典中存在os.path,却不存在a.b?(客从最后一个报错中看出来),并且,我们可以直接导入os.path(import os.path),却不可以import a.b(报错,no module named b)?

这说明,在os.py文件中,除了有import posixpath as path ,还有额外的代码,使得os.path可以直接导入,这些代码究竟是什么,等以后看源码的时候看

问题:经典类的对象明明没有__class__属性,却可以调用。的更多相关文章

  1. C#类、对象、方法和属性详解

    C#类.对象.方法和属性详解 一.相关概念: 1.对象:现实世界中的实体(世间万物皆对象) 2.类:具有相似属性和方法的对象的集合 3.面向对象程序设计的特点:封装 继承 多态 4.对象的三要素:属性 ...

  2. python 类、对象、方法、属性

    在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...

  3. python中的类,对象,方法,属性等介绍

    注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  4. python类、对象、方法、属性之类与对象笔记

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...

  5. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  6. day34-2 类和对象(重点)

    目录 类 定义类和对象 __dict__ 和__class__ 创建对象时的底层运作 定义对象独有的特征 init __slots__(了解) 给对象添加属性时的底层运作 类 分类/类别 上述的代码( ...

  7. 面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】

    若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing ...

  8. Python新式类与经典类的区别

    1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性:反之,即不由任意内置类型派生出的类 ...

  9. 类数组对象与arguments

    类数组对象 所谓的类数组对象: 拥有一个 length 属性和若干索引属性的对象 举个例子: var array = ['name', 'age', 'sex']; var arrayLike = { ...

随机推荐

  1. java实验报告一

    一.实验内容 1. 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试Java程序 二.实验步骤 (一)命令行下Java程序开发 1. 首先双击桌面上的Xface终 ...

  2. BaseServlet 继承 httpServlet

    BaseServlet   核心 package cn.core; import java.io.IOException; import java.lang.reflect.Method; impor ...

  3. 基于Ryu的服务器实现及相关请求访问处理

    基于Ryu的服务器实现及相关请求访问处理 前言及问题描述 近期又遇到了一个非常棘手的问题,由于Ryu是通过Python语言开发的,通过Ryu的wsgi的方式建立服务器,无法解析PHP,通过多次方法解决 ...

  4. c++中队列queue和栈stack的基本操作

    1.queue 模板类的定义在<queue>头文件中. 定义queue 对象的示例代码如下:queue<int> q1;queue<double> q2; queu ...

  5. 安装VS2013

       安装VS2013, 之前就有VS2010,安装了一个多小时,纠结,下面是截图.   1.安装   2.登录,之前就有账号了       3.这就是VS2013了.     4.测试     5通 ...

  6. ElasticSearch 2 (18) - 深入搜索系列之控制相关度

    ElasticSearch 2 (18) - 深入搜索系列之控制相关度 摘要 处理结构化数据(比如:时间.数字.字符串.枚举)的数据库只需要检查一个文档(或行,在关系数据库)是否与查询匹配. 布尔是/ ...

  7. PAT 甲级 1057 Stack

    https://pintia.cn/problem-sets/994805342720868352/problems/994805417945710592 Stack is one of the mo ...

  8. PAT 2016 数据的交换输出

    http://acm.hdu.edu.cn/showproblem.php?pid=2016 Problem Description 输入n(n<100)个数,找出其中最小的数,将它与最前面的数 ...

  9. [Delphi]实现使用TIdHttp控件向https地址Post请求[转]

    开篇:公司之前一直使用http协议进行交互(比如登录等功能),但是经常被爆安全性不高,所以准备改用https协议.百度了一下资料,其实使用IdHttp控件实现https交互的帖子并不少,鉴于这次成功实 ...

  10. 小程序开发 js里面array操作的方法列表。