Python构造器及析构器:__init__与__new__及__del__

__init__与__new__这两个魔法方法组成了Python类对象的构造器,在Python类实例化时,其实最先调用的不是__init__而是__new__。__new__是负责实例化对象的,而__init__是初始化操作。__del__是析构器,当Python对象的所有引用都不存在了(被del了),就会自动触发__del__执行。

class CapStr(str):
    def __new__(cls, string):   #此时string = ‘i love you‘ cls是CapStr这个类对象
        string = string.upper()
        return str.__new__(cls, string) #返回cls类带string参数的实例化的对象,但是这里为什么不直接return string ?看下面的代码段
    def __del__(self):
        print(‘__del__析构方法被调用了!‘)

>>> a = CapStr(‘i love you‘)
>>> b = a
>>> c = b
>>> del c
>>> del a
>>> del b
__del__析构方法被调用了!

由于CapStr类继承的是str这种不可修改的类型,所以,就不能在__init__方法中对str类型的数据进行自身的改变,这时候就要重写__new__来实现对不可变类型数据的修改。

1.a = CapStr(‘i love you‘)
2.首先执行使用‘i love you‘这个参数来执行CapStr类的__new__方法,这个__new__方法会返回CapStr类的一个实例(通常情况下是使用 super(CapStr, cls).__new__(cls, ... ...) 这样的方式),
3.然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是__init__里面的的self
所以,__init__ 和 __new__ 最主要的区别在于:
1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后,它是实例级别的方法。
2.__new__ 通常用于控制生成一个新实例的过程,它是类级别的方法。

class CapStr(str):
    def __new__(cls, string):
        string = string.upper()
        return string

a = CapStr(‘mmy‘)

>>> type(a)
<class ‘str‘>

class CapStr(str):
    def __new__(cls, string):
        string = string.upper()
        return str.__new__(cls, string)

>>> a = CapStr(‘mmy‘)
>>> type(a)
<class ‘__main__.CapStr‘>

可以看出,二者返回的对象是不一样的。

注:str.__new__(cls, string)的实际意思是str(string),使用工厂函数str()将参数强制转换成str类型,然后再变成str的子类型CapStr

时间: 2024-12-11 18:02:19

Python构造器及析构器:__init__与__new__及__del__的相关文章

c++第五章-(类与对象、构造器和析构器)

1.构造器与结构体的区别:构造器多支持方法.其作用有申请内存,初始化变量. 在c++中构造器没有返回值:语法Class Name(); 2.析构器的作用:释放内存. 在c++中析构器没有返回值:语法~ClassName(); class Animal { public: std::string mouth; std::string name; void eat(); void sleep(); void drool(); Animal(std::string theName); }; class

继承机制中的构造器和析构器

正如此前所讲解的,C++支持程序员自己写出将创建或销毁一个对象时自动调用的方法,也就是构造器和析构器. 在没有继承机制的情况下,我们很容易理解这些方法在创建或销毁一个对象的时候被调用.但是一旦使用了继承机制,构造器和析构器就变得有点复杂了. 比如基类有个构造器,如Animal(),它将在创造Pig 类型的对象时最先被调用,如果Pig类也有一个构造器,它将排在第二个被调用.因为基类必须在类之前初始化原则! 然后我们继续讨论:如果构浩器带着输入参数,事情变得稍微复杂了. class Animal{

构造器和析构器

一 构造器 swift的init方法是没有返回值的,而OC的init方法就有返回值,返回类本身 1.默认构造器 即使我们不写init方法,系统也会为函数默认写一个空的init方法 struct Fahrenheit {          var temperature:Double          init(){         temperature = 32.0     } } var f = Fahrenheit() 2.自定义构造器 struct Celsius {          

构造器与析构器

回顾:之前我们讨论了使用面向对象的编程技术开发程序最基本步骤: 定义一个有属性和方法的类(模板) 为该类创建一个变量(实现) 这是OOP技术的基础,现在逐步向大家介绍一些更复杂和更有用的概念. 首先是构浩器,它是类里的一种特殊的方法. 定义构浩器 构造器和通常方法的主要区别: (1)构浩器的名字必须和它所在的类的名字一样 (2)系统在创建某个类的实例时会第一时间自动调用这个类的构造器 (3)构浩器永远不会返回任何值 创建构浩器,需要先把它的声明添加到类里: class Car{ Car( voi

理解继承中的构造器和析构器

1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class FatherClass 7 { 8 public: 9 FatherClass(); 10 ~FatherClass(); 11 }; 12 13 FatherClass::FatherClass() 14 { 15 cout << "this is FatherClass constructor"

Swift构造器(Initializer)与析构器(Deinitializer)

为了初始化结构体和类等类型的实例属性. 默认构造器 [html] view plaincopy struct Fahrenheit { var temperature: Doubleinit(){ temperature = 32.0 } } var f = Fahrenheit() //调用默认构造器 init() ,没有参数 没有返回值. [html] view plaincopy println("The default temperature   is \(f.temperature)°

Python中__init__和__new__的区别详解

__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: # -*- coding: utf-8 -*- class Person(object): """Silly Person""" def __init__(self, name, age): self.name = name self.age = age def __

Python中的__init__和__new__介绍

介绍 首先我们要知道在面向对象编程中,实例化基本遵循创建实例对象.初始化实例对象.最后返回实例对象这么一个过程. Python 中的 __new__ 方法负责创建一个实例对象,__init__ 方法负责将该实例对象进行初始化. __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化,而在 __init__() 启动之前,__new__() 决定是否要使用该 __init__()

Python基础(十) __init__与__new__区别

__init__与__new__区别: __init__在python,其实是,在实例化之后执行的,用来初始化一些属性,相当于构造函数,但是又不一样 细心一些,通过参数会有所发现,其实__init__(self)  self隐式的将,实例传过来. __new__在python中其实是,在实例化之前执行的,这个通过参数一样可以看出 __new__(cls),cls是隐式的传递的类对象,并不是实例.因为__new__的任务就是,创建类实例并返回实例. class temp(object): def