问题:经典类的对象明明没有__class__属性,却可以调用。
这个问题得深入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__属性,却可以调用。的更多相关文章
- C#类、对象、方法和属性详解
C#类.对象.方法和属性详解 一.相关概念: 1.对象:现实世界中的实体(世间万物皆对象) 2.类:具有相似属性和方法的对象的集合 3.面向对象程序设计的特点:封装 继承 多态 4.对象的三要素:属性 ...
- python 类、对象、方法、属性
在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...
- python中的类,对象,方法,属性等介绍
注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...
- python类、对象、方法、属性之类与对象笔记
python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...
- 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
- day34-2 类和对象(重点)
目录 类 定义类和对象 __dict__ 和__class__ 创建对象时的底层运作 定义对象独有的特征 init __slots__(了解) 给对象添加属性时的底层运作 类 分类/类别 上述的代码( ...
- 面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing ...
- Python新式类与经典类的区别
1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性:反之,即不由任意内置类型派生出的类 ...
- 类数组对象与arguments
类数组对象 所谓的类数组对象: 拥有一个 length 属性和若干索引属性的对象 举个例子: var array = ['name', 'age', 'sex']; var arrayLike = { ...
随机推荐
- java实验报告一
一.实验内容 1. 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试Java程序 二.实验步骤 (一)命令行下Java程序开发 1. 首先双击桌面上的Xface终 ...
- BaseServlet 继承 httpServlet
BaseServlet 核心 package cn.core; import java.io.IOException; import java.lang.reflect.Method; impor ...
- 基于Ryu的服务器实现及相关请求访问处理
基于Ryu的服务器实现及相关请求访问处理 前言及问题描述 近期又遇到了一个非常棘手的问题,由于Ryu是通过Python语言开发的,通过Ryu的wsgi的方式建立服务器,无法解析PHP,通过多次方法解决 ...
- c++中队列queue和栈stack的基本操作
1.queue 模板类的定义在<queue>头文件中. 定义queue 对象的示例代码如下:queue<int> q1;queue<double> q2; queu ...
- 安装VS2013
安装VS2013, 之前就有VS2010,安装了一个多小时,纠结,下面是截图. 1.安装 2.登录,之前就有账号了 3.这就是VS2013了. 4.测试 5通 ...
- ElasticSearch 2 (18) - 深入搜索系列之控制相关度
ElasticSearch 2 (18) - 深入搜索系列之控制相关度 摘要 处理结构化数据(比如:时间.数字.字符串.枚举)的数据库只需要检查一个文档(或行,在关系数据库)是否与查询匹配. 布尔是/ ...
- PAT 甲级 1057 Stack
https://pintia.cn/problem-sets/994805342720868352/problems/994805417945710592 Stack is one of the mo ...
- PAT 2016 数据的交换输出
http://acm.hdu.edu.cn/showproblem.php?pid=2016 Problem Description 输入n(n<100)个数,找出其中最小的数,将它与最前面的数 ...
- [Delphi]实现使用TIdHttp控件向https地址Post请求[转]
开篇:公司之前一直使用http协议进行交互(比如登录等功能),但是经常被爆安全性不高,所以准备改用https协议.百度了一下资料,其实使用IdHttp控件实现https交互的帖子并不少,鉴于这次成功实 ...
- 小程序开发 js里面array操作的方法列表。