您的位置:首页 > 编程语言 > Python开发

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__()进行初始化了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: