python_魔法方法(一):构造和析构
魔法方法总是被双下划线包围,例如:__init__()
魔法方法是面向对象的python的一切,它的魔力体现在总能在合适的时候调用。
先来介绍析构和构造的三个魔法方法:
- __init__():构造方法,类在实例化成对象的时候会首先调用这个方法(可选,根据需求)
__new__():才是在一个对象实例化的时候所调用的一个方法,与其他魔方方法不同,它的第一个参数是cls(类),其他参数会传给__init__()
__del__():如果说__init__()和__new__()是对象的构造器话,__del__()方法将是打工对象被销毁时调用- 1、__init__(self[,...])
实例:
- class Rectangle:
- '''
- 定义个一个矩形列,需要长宽两个参数
- 需要对象在初始化的时候拥有长宽两个参数,因此需要重写__init__()方法
- '''
- def __init__(self,x,y): #__init__()返回值一定是None,所以不需要return语句
- self.x = x
- self.y = y
- def getPerl(self):
- return (self.x + self.y) * 2
- def getArea(self):
- return self.x * self.y
- rect = Rectangle(3,4)
- print(rect.getArea(),rect.getPerl())
打印结果:
14
12
这里需要注意的是,__init__()方法的返回值一定是None,不能是其他,否则将报错:
- class A():
- def __init__(self):
- return "A"
- cup = A()
- 执行结果:
Traceback (most recent call last):- File "<pyshell#26>", line 1, in <module>
- cup = A()
- TypeError: __init__() should return None, not 'str'
所以一般在需要进行初始化的时候才重写__init__()方法,其实__init__()并不是实例化对象时第一个被调用的魔法方法
2、__new__(cls[,...])
__new__()才是在实例化对象时所调用的第一个方法。它跟其他魔法方法不同,它的第一个参数不适合self而是类(cls),而其他的参数会直接传递给__init__()方法
__new__()方法需要返回一个实例化对象,通常是cls这个实例化的对象,当然也可以返回其他对象。
__new__()方法平时很少去重写它,一般让python用默认的方案执行就可以了。但是有一种情况需要重写这个魔法方法,就是当继承一个不可变类型的时候,它的特性就尤为重要了。
- class CapStr(str):
- def __new__(cls,string):
- string = string.upper()
- return str.__new__(str,string) #这里一定是返回继承类的__new__()方法,否则容易造成死循环
- capstr = CapStr('good afternoon')
- print(capstr)
- #结果为:GOOD AFTERNOON
这里返回的str.__new__(str,string)做法是很值得推荐的,只需要重写关组的内容,其他的琐碎东西交给python的默认机制去完成就可以了,毕竟python本身比我们自己写的要好很多
3、__del__(self)
如果说__init__()和__new__()方法是对象的构造器的话,那么python也析构了一个构造器,__del__()方法,当对象被销毁时,这个方法就一定会被调用,但要注意的是,并非del x就等同于自动调用了x.__del__(),__del__()方法是当垃圾回收机制回收这个对象的时候调用的
- >>> class C():
- def __init__(self):
- print('我是__init__()方法')
- def __del__(self): \
- print('我是__del__()方法')
- >>> c1 = C()
- 我是__init__()方法
- >>> c2 = c1
- >>> c3 = c2
- >>> del c1
- >>> del c2
- >>> del c3
- 我是__del__()方法
python_魔法方法(一):构造和析构的更多相关文章
- 魔法方法:构造和析构 - 零基础入门学习Python041
魔法方法:构造和析构 让编程改变世界 Change the world by program 构造和析构 什么是魔法方法呢?我们来系统总结下: - 魔法方法总是被双下划线包围,例如__init__ - ...
- python魔法方法之构造和析构
python的类实例化的时候会默认执行该类的构造方法_init_ class Rectangle: def __init__(self,x,y): self.x=x self.y=y def getA ...
- 零基础学习python_魔法方法(41-48课)(迭代器)
接下来这个为啥要叫魔法方法呢,额,这个嘛我是跟小甲鱼的视频取的名字一样的,因为会讲比较多杂的东西,有... 魔法方法详细阅读地址:http://bbs.fishc.com/thread-48793-1 ...
- python_魔法方法(六):迭代器和生成器
迭代器 自始至终,都有一个概念一直在用,但是我们却没来都没有人在的深入剖析它.这个概念就是迭代. 迭代的意思有点类似循环,每一次的重复的过程被称为迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭 ...
- python_魔法方法(五):描述符和定制序列
描述符(property的原理) 描述符(descripto),用一句话来解释,描述符就是某种特殊的类的实例指派给另一个类的属性.那么什么是特殊类型的类呢?就是至少要在这个类中定义__get__(). ...
- python_魔法方法(四):属性访问
通常可以通过点(.)操作符的形式去访问对象的属性,也可以通过BIF适当地去访问属性,看个例子吧 >>> class A(): def __init__(self): self.x = ...
- python_魔法方法(三):__str__()和__repr__()
使用python的魔法方法和time模块定制一个计时器的类 1.用time模块里的localtime()方法获取时间2.time.localtime返回struct_time格式3.表现你的类:__s ...
- python_魔法方法(二):算术运算
python2.2之后,对类和类型做了同意,将int().float().str().list().touple()这些BIF转换为工厂函数 >>> type(len) <cl ...
- python里的魔法方法1(构造与析构)
魔法方法——构造与析构 1.python编程的魔法方法: (1)魔法方法总是被双下划线包围,例如__init__: (2)魔法方法是面向对象的python的一切. 2.__new__(class[,… ...
随机推荐
- Unity3d中SendMessage 用法
Message相关有3条指令:SendMessage ("函数名",参数,SendMessageOptions) //GameObject自身的ScriptBroadcastM ...
- 安装phpredis
1.下载安装包 https://github.com/nicolasff/phpredis/archive/2.2.5.tar.gz 2.解压到~目录 tar -xvf phpredis-2.2.5. ...
- (转)python set 用法
转载自:http://hi.baidu.com/����_xu/blog/item/5b9650c513bd3f049d163d8b .html python的set和其他语言类似, 是一个 基本功能 ...
- Python:正则表达式(三)*、+、?的用法
一.功能*——表示匹配前面的字符0个或多个:+——表示前面的字符1个或多个:?——(1)放在其他字符后面:表示匹配0次或1次: (2)放在*.+后面:表示匹配尽可能少的字符 二.例 字符串fooooo ...
- js字符串API
1.charAt(n) :返回字符串n位置的字符 2.substr(n,m):n:开始截取的位置 m:截取的长度 2.substring(n,m):n:开始截取的位置 m:截取结束的位置 3.repl ...
- Linux编程里getopt_long_only函数用法详解
在程序中难免需要使用命令行选项,可以选择自己解析命令行选项,但是有现成的,何必再造轮子.下面介绍使用getopt_long_only和getopt_long(两者用法差不多)解析命令行选项. 程序中主 ...
- Python模块-subprocess模块
Run()方法 >>> a = subprocess.run(['df','-h']) 文件系统 容量 已用 可用 已用% 挂载点 udev 468M 0 468M 0% /dev ...
- Centos7 忘记密码的情况下,修改root或其他用户密码
转载:https://blog.csdn.net/wcy00q/article/details/70570043 应用场景 linux管理员忘记root密码,需要进行找回操作. 注意事项:本文基于ce ...
- Jenkins配置邮件SMTP(使用QQ邮箱)
一.QQ邮箱中开启SMTP服务 进入QQ邮箱的设置页面,选择开启POP3/SMTP服务 需要发送一条短信开启服务,成功后,会收到一个密码,一定要截图.复制密码保存好 二.Jenkins中配置SMTP ...
- [Uva10641]Barisal Stadium(区间dp)
题意:按照顺时针给出操场的周边点,然后给出周围可以建设照明灯的位置,以及在该位置建设照明灯的代价,照明灯照射的范围与操场的边界相切,现在要求一个最小的花费,要求操场的所有边都被照射到. 解题关键:预处 ...