Python 面向对象中的__init__、__new__以及super()

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__()进行初始化了

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象编程,__new__和__init__都是用于创建类实例的方法,但它们的作用不同。 __new__方法是用于创建实例并返回它的实例对象的方法。它是类级别的方法,即它是在类级别上定义的,而不是在实例级别上定义的。__new__方法的第一个参数是类本身,其余参数是传递给类构造函数的参数。__new__方法的返回值通常是一个新的实例对象,但也可以返回一个已经存在的实例对象。 __init__方法是用于初始化实例的方法。它是实例级别的方法,即它是在实例级别上定义的。__init__方法的第一个参数是self,它指向正在初始化的实例对象。其余参数是传递给类构造函数的参数。__init__方法通常不返回任何值,它只是初始化实例的状态。 因此,__new__方法是用于创建实例对象的,而__init__方法是用于初始化实例对象的。__new__方法返回一个新的实例对象,而__init__方法对该实例对象进行初始化。 下面是一个简单的例子,演示了__new__和__init__方法的区别: ```python class MyClass: def __new__(cls, *args, **kwargs): print("__new__ method is called") instance = super().__new__(cls) return instance def __init__(self, *args, **kwargs): print("__init__ method is called") self.name = args[0] self.age = args[1] my_obj = MyClass("Tom", 25) print(my_obj.name) print(my_obj.age) ``` 输出结果为: ``` __new__ method is called __init__ method is called Tom 25 ``` 在这个例子,__new__方法被调用来创建实例对象,然后__init__方法被调用来初始化该实例对象的状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值