魔法方法总是被双下划线包围,例如:__init__()

魔法方法是面向对象的python的一切,它的魔力体现在总能在合适的时候调用。

先来介绍析构和构造的三个魔法方法:

  1. __init__():构造方法,类在实例化成对象的时候会首先调用这个方法(可选,根据需求)
    __new__():才是在一个对象实例化的时候所调用的一个方法,与其他魔方方法不同,它的第一个参数是cls(类),其他参数会传给__init__()
    __del__():如果说__init__()和__new__()是对象的构造器话,__del__()方法将是打工对象被销毁时调用
  2.  
  3. 1__init__(self[,...])
    实例:
  1. class Rectangle:
  2. '''
  3. 定义个一个矩形列,需要长宽两个参数
  4. 需要对象在初始化的时候拥有长宽两个参数,因此需要重写__init__()方法
  5. '''
  6. def __init__(self,x,y): #__init__()返回值一定是None,所以不需要return语句
  7. self.x = x
  8. self.y = y
  9. def getPerl(self):
  10. return (self.x + self.y) * 2
  11. def getArea(self):
  12. return self.x * self.y
  13.  
  14. rect = Rectangle(3,4)
  15. print(rect.getArea(),rect.getPerl())

打印结果:

14

12

这里需要注意的是,__init__()方法的返回值一定是None,不能是其他,否则将报错:

  1. class A():
  2. def __init__(self):
  3. return "A"
  4.  
  5. cup = A()
  1. 执行结果:
    Traceback (most recent call last):
  2. File "<pyshell#26>", line 1, in <module>
  3. cup = A()
  4. TypeError: __init__() should return None, not 'str'

所以一般在需要进行初始化的时候才重写__init__()方法,其实__init__()并不是实例化对象时第一个被调用的魔法方法

2、__new__(cls[,...])

__new__()才是在实例化对象时所调用的第一个方法。它跟其他魔法方法不同,它的第一个参数不适合self而是类(cls),而其他的参数会直接传递给__init__()方法

__new__()方法需要返回一个实例化对象,通常是cls这个实例化的对象,当然也可以返回其他对象。

__new__()方法平时很少去重写它,一般让python用默认的方案执行就可以了。但是有一种情况需要重写这个魔法方法,就是当继承一个不可变类型的时候,它的特性就尤为重要了。

  1. class CapStr(str):
  2. def __new__(cls,string):
  3. string = string.upper()
  4. return str.__new__(str,string) #这里一定是返回继承类的__new__()方法,否则容易造成死循环
  5.  
  6. capstr = CapStr('good afternoon')
  7. print(capstr)
  8.  
  9. #结果为:GOOD AFTERNOON

这里返回的str.__new__(str,string)做法是很值得推荐的,只需要重写关组的内容,其他的琐碎东西交给python的默认机制去完成就可以了,毕竟python本身比我们自己写的要好很多

3、__del__(self)

如果说__init__()和__new__()方法是对象的构造器的话,那么python也析构了一个构造器,__del__()方法,当对象被销毁时,这个方法就一定会被调用,但要注意的是,并非del x就等同于自动调用了x.__del__(),__del__()方法是当垃圾回收机制回收这个对象的时候调用的

  1. >>> class C():
  2. def __init__(self):
  3. print('我是__init__()方法')
  4. def __del__(self): \
  5. print('我是__del__()方法')
  6.  
  7. >>> c1 = C()
  8. 我是__init__()方法
  9. >>> c2 = c1
  10. >>> c3 = c2
  11. >>> del c1
  12. >>> del c2
  13. >>> del c3
  14. 我是__del__()方法

python_魔法方法(一):构造和析构的更多相关文章

  1. 魔法方法:构造和析构 - 零基础入门学习Python041

    魔法方法:构造和析构 让编程改变世界 Change the world by program 构造和析构 什么是魔法方法呢?我们来系统总结下: - 魔法方法总是被双下划线包围,例如__init__ - ...

  2. python魔法方法之构造和析构

    python的类实例化的时候会默认执行该类的构造方法_init_ class Rectangle: def __init__(self,x,y): self.x=x self.y=y def getA ...

  3. 零基础学习python_魔法方法(41-48课)(迭代器)

    接下来这个为啥要叫魔法方法呢,额,这个嘛我是跟小甲鱼的视频取的名字一样的,因为会讲比较多杂的东西,有... 魔法方法详细阅读地址:http://bbs.fishc.com/thread-48793-1 ...

  4. python_魔法方法(六):迭代器和生成器

    迭代器 自始至终,都有一个概念一直在用,但是我们却没来都没有人在的深入剖析它.这个概念就是迭代. 迭代的意思有点类似循环,每一次的重复的过程被称为迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭 ...

  5. python_魔法方法(五):描述符和定制序列

    描述符(property的原理) 描述符(descripto),用一句话来解释,描述符就是某种特殊的类的实例指派给另一个类的属性.那么什么是特殊类型的类呢?就是至少要在这个类中定义__get__(). ...

  6. python_魔法方法(四):属性访问

    通常可以通过点(.)操作符的形式去访问对象的属性,也可以通过BIF适当地去访问属性,看个例子吧 >>> class A(): def __init__(self): self.x = ...

  7. python_魔法方法(三):__str__()和__repr__()

    使用python的魔法方法和time模块定制一个计时器的类 1.用time模块里的localtime()方法获取时间2.time.localtime返回struct_time格式3.表现你的类:__s ...

  8. python_魔法方法(二):算术运算

    python2.2之后,对类和类型做了同意,将int().float().str().list().touple()这些BIF转换为工厂函数 >>> type(len) <cl ...

  9. python里的魔法方法1(构造与析构)

    魔法方法——构造与析构 1.python编程的魔法方法: (1)魔法方法总是被双下划线包围,例如__init__: (2)魔法方法是面向对象的python的一切. 2.__new__(class[,… ...

随机推荐

  1. Unity3d中SendMessage 用法

      Message相关有3条指令:SendMessage ("函数名",参数,SendMessageOptions) //GameObject自身的ScriptBroadcastM ...

  2. 安装phpredis

    1.下载安装包 https://github.com/nicolasff/phpredis/archive/2.2.5.tar.gz 2.解压到~目录 tar -xvf phpredis-2.2.5. ...

  3. (转)python set 用法

    转载自:http://hi.baidu.com/����_xu/blog/item/5b9650c513bd3f049d163d8b .html python的set和其他语言类似, 是一个 基本功能 ...

  4. Python:正则表达式(三)*、+、?的用法

    一.功能*——表示匹配前面的字符0个或多个:+——表示前面的字符1个或多个:?——(1)放在其他字符后面:表示匹配0次或1次: (2)放在*.+后面:表示匹配尽可能少的字符 二.例 字符串fooooo ...

  5. js字符串API

    1.charAt(n) :返回字符串n位置的字符 2.substr(n,m):n:开始截取的位置 m:截取的长度 2.substring(n,m):n:开始截取的位置 m:截取结束的位置 3.repl ...

  6. Linux编程里getopt_long_only函数用法详解

    在程序中难免需要使用命令行选项,可以选择自己解析命令行选项,但是有现成的,何必再造轮子.下面介绍使用getopt_long_only和getopt_long(两者用法差不多)解析命令行选项. 程序中主 ...

  7. Python模块-subprocess模块

    Run()方法 >>> a = subprocess.run(['df','-h']) 文件系统 容量 已用 可用 已用% 挂载点 udev 468M 0 468M 0% /dev ...

  8. Centos7 忘记密码的情况下,修改root或其他用户密码

    转载:https://blog.csdn.net/wcy00q/article/details/70570043 应用场景 linux管理员忘记root密码,需要进行找回操作. 注意事项:本文基于ce ...

  9. Jenkins配置邮件SMTP(使用QQ邮箱)

    一.QQ邮箱中开启SMTP服务 进入QQ邮箱的设置页面,选择开启POP3/SMTP服务 需要发送一条短信开启服务,成功后,会收到一个密码,一定要截图.复制密码保存好 二.Jenkins中配置SMTP ...

  10. [Uva10641]Barisal Stadium(区间dp)

    题意:按照顺时针给出操场的周边点,然后给出周围可以建设照明灯的位置,以及在该位置建设照明灯的代价,照明灯照射的范围与操场的边界相切,现在要求一个最小的花费,要求操场的所有边都被照射到. 解题关键:预处 ...