Python 面向对象中的__init__、__new__以及super()
2016-10-28 18:33
459 查看
1、__init__()和__new__()的关系
借用代码解释一下,注意这些都是在python2.7下面构造的,在py3.x可能会有所不同,比如在super()上,Python 2 里super() 是一定要有参数的。
# -*- coding: utf-8 -*-
class Person(object):
"""Silly Person"""
def __new__(cls, name, age):
print '__new__ called.'
return super(Person, cls).__new__(cls, name, age)
def __init__(self, name, age):
print '__init__ called.'
self.name = name
self.age = age
def __str__(self):
return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
piglei = Person('piglei', 24)
print piglei运行结果为
__new__ called.
__init__ called.
<Person: piglei(24)>可以看出在类的实例化过程中,首先调用的就是__new__(cls,...)目的的是实例的创建,第一个参数是必须有的,表达的是要进行实例化的类(这个是由Python解释器自动提供的),“....”表示的是实例化的一些参数,如果要对当前的类进行实例化__new__()应该返回的是当前类实例化后的对象(也就是self)。如果要得到当前类的实例,应当在当前类中的__new__()方法语句中调用当前类的父类
的__new__()方法(这也是默认的),也就是说除了利用object类的方法,也可选择其他的类来构造实例,但是这样的对象也就变成了其他类的实例了(不太知道为什么可以这样,有什么意义?)我们不讨论这种情况,假设实例化的方法都是调用的object类的__new__()方法,我们通过super(Person,cls).__new__(cls,....)就可以调用父类的实例化方法了。
在返回了实例self之后就是要调用__init__()进行初始化了
借用代码解释一下,注意这些都是在python2.7下面构造的,在py3.x可能会有所不同,比如在super()上,Python 2 里super() 是一定要有参数的。
# -*- coding: utf-8 -*-
class Person(object):
"""Silly Person"""
def __new__(cls, name, age):
print '__new__ called.'
return super(Person, cls).__new__(cls, name, age)
def __init__(self, name, age):
print '__init__ called.'
self.name = name
self.age = age
def __str__(self):
return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
piglei = Person('piglei', 24)
print piglei运行结果为
__new__ called.
__init__ called.
<Person: piglei(24)>可以看出在类的实例化过程中,首先调用的就是__new__(cls,...)目的的是实例的创建,第一个参数是必须有的,表达的是要进行实例化的类(这个是由Python解释器自动提供的),“....”表示的是实例化的一些参数,如果要对当前的类进行实例化__new__()应该返回的是当前类实例化后的对象(也就是self)。如果要得到当前类的实例,应当在当前类中的__new__()方法语句中调用当前类的父类
的__new__()方法(这也是默认的),也就是说除了利用object类的方法,也可选择其他的类来构造实例,但是这样的对象也就变成了其他类的实例了(不太知道为什么可以这样,有什么意义?)我们不讨论这种情况,假设实例化的方法都是调用的object类的__new__()方法,我们通过super(Person,cls).__new__(cls,....)就可以调用父类的实例化方法了。
在返回了实例self之后就是要调用__init__()进行初始化了
相关文章推荐
- python第七天学习记录——面向对象高级以及socket编程
- 关于python MRO __init__,__new__的讲解,super
- python的__init__、__dict__以及类变量和对象变量的关系
- python面向对象中的__init__方法怎么理解?
- 【原创】Python 对象创建过程中元类, __new__, __call__, __init__ 的处理
- python __new__以及__init__
- python(二):函数以及面向对象相关
- python学习之路-7 模块configparser/xml/shutil/subprocess以及面向对象初级入门
- 面向对象语言的new操作
- JAVA面向对象基础:继承、变量隐藏、方法重写、包、修饰符、this、super
- python面向对象初步
- DLL中New和外部Delete以及跨DLL传递对象的问题
- Lua面向对象设计中添加super
- python中最后一个基础知识点,面向对象
- python __init__和__new__之间的区别
- Python学习笔记(2)--面向对象
- python面向对象代码示例
- 面向对象控与python内存泄漏
- [转载]有关DLL中New和外部Delete以以及跨DLL传递对象的若干问题
- JavaScript中的new-面向对象实现原理