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[,… ...
随机推荐
- 【LeetCode】084. Largest Rectangle in Histogram
题目: Given n non-negative integers representing the histogram's bar height where the width of each ba ...
- mouseout与mouseleave的区别
1 mouseout:当鼠标指针从元素上移开时,发生 mouseout 事件.该事件大多数时候会与 mouseover 事件一起使用. 2 mouseout与 mouseleave 事件不同,不论鼠标 ...
- 通用RowMapper封装查询结果到自定义类中
package object; import java.lang.reflect.Field;import java.sql.ResultSet;import java.sql.SQLExceptio ...
- Azure CLI下载Azure Storage Container内的所有文件
在某些场景下,客户需要把Azure Storage的某一个container内的内容都下载到本地.当然采用PowerShell可以定时的进行下载的动作,但有时客户的环境是Linux或MacOS,这时需 ...
- 【转】Unity3D如何制作落叶效果
原文地址:http://hi.baidu.com/cupgenie/item/c23861df692f59e3b3f777a8 创建一个粒子系统 GameObject>Create other& ...
- Linux负载均衡软件之LVS
一. LVS简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是linuxvirtualserver.org ...
- DCloud-MUI:Hello MUI2
ylbtech-DCloud: 1. <head> <meta charset="utf-8"> <title>Hello MUI</ti ...
- 发布倒计时!JDK11为我们带来哪些新特性?
今年7月底,JDK11已经进入了Rampdown Phase Two阶段,这标志着该版本所有特性已经被冻结,不会有新的JEP会加入版本中. 这一阶段将会修复P1–P2级BUG,之后,JDK11预定于今 ...
- console (控制台)
console 模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台. 该模块导出了两个特定的组件: 一个 Console 类,包含 console.log() ...
- 局域网中使用的IP地址有哪些?
当我们建设一个局域网的时候,需要为网络中的每台计算机分配一个IP地址.那么都有哪些IP地址可以使用在局域网中呢?局域网中的IP地址有什么规定呢? 在局域网中,我们是不能使用如202.106.45.11 ...