python类和对象的底层实现
按照python中"一切皆对象的原理",所有创建的对象,都是一个已知存在的class实例化的结果;那么class又是被哪个"类"实例化的呢?先看下面的一段代码
class Foo(object):
pass obj = Foo()
print type(obj)
print type(Foo) 结果为:
<class '__main__.Foo'>
<type 'type'>
可以看到:obj是由Foo实例化,而Foo由type类创建
这样Foo就可以这样实现了,看下面:
def func(self):
print "charles" Foo = type('Foo',(object,),{'func':func})
print Foo
f = Foo()
f.func() 结果为:
<class '__main__.Foo'>
charles
那么问题随之产生了,既然class是由type实例化而来的,那么type中是如何实现类的创建的呢?
实际上,在被type实例化的类中,有一个__metaclass__字段,指明由谁来实例化得到该类
class MyType(type):
def __init__(self, what, bases=None, dict=None):
print "333"
super(MyType, self).__init__(what, bases, dict)
def __call__(self, *args, **kwargs):
print "444"
obj = self.__new__(self, *args, **kwargs)
self.__init__(obj)
class Foo(object):
__metaclass__ = MyType
def __init__(self):
print '222'
def __new__(cls, *args, **kwargs):
print '1111'
return object.__new__(cls, *args, **kwargs)
obj = Foo()
结果为:
333
444
1111
222
可以看到Mytype和Foo都存在__new__()方法,那么这个方法是干什么的呢?
__new__()函数:
看下面:
class A(object):
def __init__(self):
print 'init' def __new__(cls, *args, **kwargs):
print "first"
print object.__new__(cls,*args,**kwargs)
A() 结果:
first
<__main__.A object at 0x0000000002730EB8>
可以看到__new__方法比__init__方法先执行,object.__new__(cls,*args,**kwargs)为A的实例化的对象,如果我打印self的话
class A(object):
def __init__(self):
print self,'----'
print 'init' def __new__(cls, *args, **kwargs):
print "first"
print object.__new__(cls,*args,**kwargs)
return object.__new__(cls,*args,**kwargs)
A() 结果为:
first
<__main__.A object at 0x000000000260BE10>
<__main__.A object at 0x000000000260BE10> ----
init
可以看到self的值,正好是__new__返回的结果;
观察__new__返回的对象,参数中包含cls,表示当前的类,如果传入的不是当前的类(即使是父类),__init__不会被调用:
class B(object):
pass
class A(B):
def __init__(self):
print self,'----'
print 'init' def __new__(cls, *args, **kwargs):
print "first"
return object.__new__(B,*args,**kwargs)
A() 结果为:
first
<__main__.A object at 0x000000000238BEB8>
结论:1、python的类的实例,是__new__方法创建的
2、__new__方法必须有一个cls参数,表示当前类,只有传入的是当前cls,__init__才会被调用
3、类的实例self,就是__new__方法return object.__new__(cls,*args,**kwargs)的结果;
参考:http://www.cnblogs.com/tuzkee/p/3540293.html
http://www.cnblogs.com/wupeiqi/p/4766801.html
python类和对象的底层实现的更多相关文章
- 一文讲全了Python 类和对象内容
摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan . Pytho ...
- python类与对象各个算数运算魔法方法总结
1.python类与对象各个算术运算魔法方法总结: 2.各个魔法方法应用举例: 3.实例训练: (1)我们都知道在 Python 中,两个字符串相加会自动拼接字符串,但遗憾的是两个字符串相减却抛出异常 ...
- python 类和对象的属性
python类和对象的属性分为类属性和对象属性两大类,类属性属于类,而对象属性属于对象. 1. 父类的对象属性会被子类的对象继承. 2. 父类的类属性会被子类继承,还是作为类属性,如果父类改变了类属性 ...
- python类、对象
python类.对象 学习完本篇,你将会深入掌握 什么是类,对象 了解类和对象之间的关系 能独立创建一个People(人类),属性有姓名.性别.年龄.提供一个有参的构造方法,编写一个show方法,输出 ...
- python 类、对象、方法、属性
在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...
- python类、对象、方法、属性之类与对象笔记
python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...
- python类与对象基本语法
面向对象编程的2个非常重要的概念:类和对象. 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念--类. 类就相当于制造飞机时的图纸,用它 ...
- python 类和对象
类和对象 类 1.类的组成 数据和函数,二者是类的属性 2.两个作用: 实例化 属性引用 属性引用:类名.属性(增删改查) 实例化: 类名加括号就是实例化,会自动出发__init__的运行 ...
- Python类和对象
目录 类与对象 其他方法 继承 经典类和新式类 派生 组合 接口.归一化设计与抽象类 继承实现的原理 子类中调用父类的方法 指名道姓 super()方法 多态与多态性 封装 单下划线开头 双下划线开头 ...
随机推荐
- java synchronized 同步详解
记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchron ...
- 【Unix网络编程】chapter6IO复用
chapter6 6.1 概述 I/O复用典型使用在下列网络应用场合. (1):当客户处理多个描述符时,必须使用IO复用 (2):一个客户同时处理多个套接字是可能的,不过不叫少见. (3):如果一个 ...
- selenium在scrapy中的应用
引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现 ...
- Activity取消默认转场动画;去掉默认转场动画;
取消默认转场动画: 一般启动一个新的Activity都默认有切换的动画效果,比如打开界面时从右至左的移动.关闭时从右向左的移动,又或者是上下移动.但是有的时候我们不想要这个动画怎么办? 来上代码: m ...
- Build path specifies execution environment J2SE-1.5. There are no JREs installed in the workspace that are strictly compatible with this environment.
错误信息: Description Resource Path Location TypeBuild path specifies execution environment J2SE-1.5. Th ...
- 【eclipse jar包】在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可。
Eclipse中导入外部jar包 在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可. 工具/原料 Eclipse 需要 ...
- 【Selenium-WebDriver自学】Selenium TestNG(十四)
==================================================================================================== ...
- Eclipse svn 项目 星号
上图: 明明没有文件修改过就是无脑显示有提交的文件,有强迫症受不了. 而且每次提交你都点开看有没有漏掉啥文件.很麻烦.也很难受 .很容易漏提交 把本地文件跟SVN同步对比一下. 果然有文件. 添加规则 ...
- HPROF - Heap Profile
基于动态链接库实现,可用于性能分析,锁内容.诊断memory leak问题等.获得堆开辟信息 java -agentlib:hprof=heap=sites ToBeProfiledClass 帮助文 ...
- Hive Ntile分析函数学习
NTILE(n) 用于将分组数据按照顺序切分成n片,返回当前记录所在的切片值 NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid O ...