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[,… ...
随机推荐
- Tomcat配置MySql连接池问题
配置过程如下: 1.修改Tomcat—>conf目录下的context.xml文件 <Context path="/DBTest" docBase="DBTe ...
- [转]JS的内存泄露处理
问题: 1.给DOM对象添加的属性是一个对象的引用.范例: var MyObject = {}; document.getElementByIdx_x('myDiv').myProp = MyObje ...
- POJ3087(模拟)
#include"iostream" #include"string" #include"map" using namespace std; ...
- Python:Iterable和Iterator
转于:https://blog.csdn.net/whgqgq/article/details/63685066 博主:gongqi1992 iterable和iterator最基本的区别: iter ...
- ES6学习之数组扩展
扩展运算符(...将数组分割为用逗号分割的参数序列) console.log(...[1,2,3]) //1 2 3 可替换数组的apply写法: function test(x,y,z){ cons ...
- nmap 快速扫描所有端口
nmap -sT -sV -Pn -v xxx.xxx.xxx.xxx nmap -sS -p 1-65535 -v 192.168.1.254参数:-sS TCP SYN扫描 nmap ...
- python 基础 字符串格式化
print "hello %s %s" % ('wd','pc') c风格 print "hello {1} {0}".format("wd" ...
- Arcane Numbers 1
Vance and Shackler like playing games. One day, they are playing a game called "arcane numbers& ...
- 在虚拟机中的Ubuntu搭建java开发环境
前提: 安装好虚拟机 在虚拟机中装好了Ubuntu系统 以上两步请参见我的博客(python进阶) 1 安装JDK 1.1 到官网下载jdk压缩包并保存在本地 jdk1.8:点击前往 1.2 在Ubu ...
- Python脚本打包为exe文件
本文转载自http://www.open-open.com/lib/view/open1342675735745.html 把用Python写好的脚本,可以用pyinstaller打包成.exe文 ...