python魔法方法

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对象
>>> a
123
>>>b=int('456')  #b对象
>>> b
456
>>> a+b
579

python的魔法方法还提供了对象的数值处理,通过对魔法方法的重写,可以自定义任何算术之间的对象运算。


例子:

>>> class New_int(int):  #创建一个类继承int
	def __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+b
11
>>> a-b
-5
下面那样写return会出现无限递归:

>>> class Try_int(int):
	def __add__(self,other): #self是a
		return self+other   #改成这样就正常了:return int(self)+int(other)
	def __sub__(self,other):  #self是b
		return 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 计时器实现

。。。。。。。。。。。。。。。


 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值