python魔法方法
来源:互联网 发布:java attach source 编辑:程序博客网 时间:2024/04/30 11:24
python的构造和析构
1.魔法方法总是被双下划线包围,如__init__;
2.魔法方法是面向对象的Python的一切;
3.魔法方法的魔力体现在他们总能够在适当的时候自动被调用;
构造器:__init__和__new__
1.__init__(self,[…])
这个是面向对象语言的构造方法,也就是类在实例化对象的时候,首先会自动调用这个方法。
为什么在类定义时有时候用到__init__方法,有时候却没有?
需求!看需求需不需要!看例子:
#定义一个矩形,矩形是有长和宽的,我们知道在类实例化时是会调用__init__方法的,默认是没有参数的,这里我们需要重写__init__方法,在类实例化时传入长和宽,(这就是需求)
>>>class Rectangle(): def __init__(self,x,y): self.x = x #self.x是类实例对象的局部变量,x是传入的参数 self.y = y #__init__的返回值必须是none。不写就是默认return none。 def getPeri(self): return (self.x+self.y)*2 def getArea(self): return self.x*self.y >>> r =Rectangle(4,5) #实例化对象要传入长和宽>>>r.getArea ()20>>>r.getPeri()18
一般我们需要对一个对象进行初始化操作的时候我们才会重写__init__(这就是需求吧)
2.__new__(cls,[…])
__init__方法在类实例化时会被调用,但__init__方法并不是类实例化时第一个被调用的魔法方法!
第一个被调用的魔法方法是:__new__(cls,[…..])
第一个参数不是self是cls这与其他魔法方法不同,也就是这个类本身,如果后面有参数的话,它会原封不动的传给__init__方法;
__new__(cls)方法需要一个实例对象作为返回值,通常返回这个类的实例化对象,但是__new__方法平时是极少去重写它的,一般用python默认方案执行就行。
有一种情况需要重写__new__方法,就是继承一个不可变类型,又需要修改的时候就需要重写__new__方法了。
如下例子:
#创建一个全部大写的字符串的类。我们这个类继承一个不可改变的str类(字符串),就不能在__init__方法对它自身进行修改,应该在__new__的时候把它进行替换。
>>>class CapStr(str):#重写__new__,因为在类实例化的时候无论传入什么都输出大写,str是不可修改的,所以必须在实例化之前就对它进行修改 def __new__(cls,string): string = string.upper() #调用字符串upper()方法进行转换 return str.__new__ (cls,string) #需要return一个实例化对象,把变成大写后的string传给string,调用str.__new__做返回。 >>> a =CapStr("The fish IS good")>>> a #全部转为大写了。'THE FISH ISGOOD'
析构器__del__
3.__del__(self)
当对象将要被销毁的时候这个__del__就会自动被调用,当垃圾回收机制。当垃圾回收机制在销毁这个对象时就会自动调用__del__方法。
例子:
>>>class C: def __init__(self): print("我是__init__方法,我被调用了") def __del__(self): print("我是__del__方法,我被调用了") >>> c1=C() #实例化C(),实例化对象我是__init__方法,我被调用了>>> c2=c1 #c2不是对象是一个变量>>> c3=c2 #c3也是变量>>> delc3 #del 变量不会调用__del__方法>>> delc2>>> delc1 #c1是实例化对象,del一个对象,就会调用__del__方法。我是__del__方法,我被调用了
魔法方法--算术运算
所谓的工厂函数实际上就是类对象。
对象是可以进行计算的,
>>> a=int('123') #a对象>>> a123>>>b=int('456') #b对象>>> b456>>> a+b579
python的魔法方法还提供了对象的数值处理,通过对魔法方法的重写,可以自定义任何算术之间的对象运算。
例子:
>>> class New_int(int): #创建一个类继承intdef __add__(self,other):return int.__add__(self,other)def __sub__(self,other):return int.__sub__(self,other)>>> a =New_int(3)>>> b =New_int(8)>>> a+b11>>> a-b-5下面那样写return会出现无限递归:
>>> class Try_int(int):def __add__(self,other): #self是areturn self+other #改成这样就正常了:return int(self)+int(other)def __sub__(self,other): #self是breturn self+self>>> a =Try_int(6)>>> b = Try_int(9)>>> a+b
算术的魔法方法:
当对象进行算术的操作时就会触发对应的魔法方法,一旦重写了这些魔法方法,python就会根据意图进行计算。
。。。。。。。魔法方法小练习:
>>>class A(): def __str__(self): #重写str字符串 return "哈哈,你好啊" >>> a=A()>>> a<__main__.Aobject at 0x00000000031B0278>>>>print(a)哈哈,你好啊>>>class B(): def __repr__(self): #重写repr return "哈哈打法是否" >>> b=B()>>> b哈哈打法是否
重写__str__,__repr__后,通过类对象直接输出字符。
MyTimer.py 计时器实现
。。。。。。。。。。。。。。。
- Python魔法方法--基本的魔法方法
- Python中的魔法方法
- {python} 魔法方法
- python魔法方法
- python中的魔法方法
- Python 魔法方法详解
- Python魔法方法指南
- python魔法方法
- python的魔法方法
- Python魔法方法--属性
- Python 魔法方法详解
- python魔法方法
- python的魔法方法
- python魔法方法
- Python的魔法方法
- python魔法方法
- 【python 】魔法方法
- Python 魔法方法详解
- (POJ 1703) Find them, Catch them【典型并查集:判断在不同的集合】
- ubuntu16.04主题美化和软件推荐
- 现场支援-问题解决记录
- 1. spark源码学习分享:reduceByKey
- android 录像 录制
- python魔法方法
- BZOJ 4137 [FJOI2015]火星商店问题
- c语言中malloc、realloc与calloc 的区别以及联系
- Vim编辑常用快捷键整理
- 文件操作工具类FileUtils
- Maven创建EJB项目HelloWorld使用IDE为eclipse
- jQuery获取尺寸
- Day9、ListView常用事件、点击按钮和点击每行的背景转换器Selector
- Spring注解hibernate实体类bean