面向对象--03魔法方法

python的魔法方法(被双下划线包围)      所谓工厂函数就是类对象
1.构造方法
①__new__(cls[,...])
实例化对象时第一个被调用的方法
cls-->类   如果cls后还有参数,则参数会原封不动的传给init方法,new方法需要一个实例对象作为返回值(return),通常为cls
极少重写,但当继承一个不可变类型时需要重写new方法


__new__方法的调用是发生在__init__之前的。其实当 你实例化一个类的时候,具体的执行逻辑是这样的:
①.p = Person(name, age)
②.首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会 返回Person类的一个实例(通常情况下是使用 super(Persion, cls).__new__(cls, … …) 这样的方式),
③.然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是 __init__里面的的 self
所以,__init__ 和 __new__ 最主要的区别在于:
(1)__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
(2)__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法。

例一
>>> class CapStr(str):
 def __new__(cls,string):
  string = string.upper()
  return str.__new__(cls,string)  #调用基类的new方法
 
>>> a = CapStr('i love someone')
>>> a
'I LOVE SOMEONE'
>>>

例二
假如我们需要一个永远都是正数的整数类型,通过集成int,我们可能会写出这样的代码。
>>> class PositiveInteger(int):
    def __new__(cls, value):
        return super(PositiveInteger, cls).__new__(cls, abs(value))
>>> i = PositiveInteger(-3)
>>> print(i)
3
>>>

②__init__(self[,...])
 init方法下不能有return返回(或者说返回None)
不能对不可变类型的init方法进行重写
用于初始化对象的属性。__init__方法可以在创建对象的时候就设置好属性。
当创建对象以后,Python解释器会默认调用__init__(self)方法。
例:使用构造方法
>>> class Car:
 #构造方法
 def __init__(self):
  self.color = '黑色'
  
>>> #创建一个对象,并用变量car保存它的引用
>>> car = Car()
>>> car.color
'黑色'

例:使用带参构造方法
>>> class Car:
 #带参构造方法
 def __init__(self,color):
  self.color = color
  
>>> bwm = Car('香槟色')
>>> bwm.color
'香槟色'


2.析构方法
__del__(self)
当所有对象对类的引用都被del之后,才会调用__del__(self)方法(垃圾回收机制)
用于释放类所占用的资源
当删除一个对象来释放类所占用资源的时候,Python解释器会默认调用__del__(self)方法。

3.有关算术运算的魔法方法
__add__(self,other)    定义加法的行为+
__sub__(self,other)    定义减法的行为-
__mul__(self,other)    定义乘法的行为*
__truediv__(self,other)  定义真除法的行为/
__floordiv__(self,other)  定义整数除法的行为//
__mod__(self,other)   定义取模算法的行为%
__divmod__(self,other)     定义当被divmod()调用时的行为
__pow__(self,other[,modulo])     定义当被power()调用或**运算时的行为

4.反运算r
self为主,other为辅,当self不支持所用方法时,会调用other的方法
__radd__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用
例一
>>> class int(int):
 def __radd__(self,other):
  return int.__sub__ (self,other)
 
>>> a = int(2)
>>> b = int(6)
>>> a + b
8
>>> 2 + b
4
>>>


例二(1)
>>> class int(int):
 def __rsub__(self,other):
  return int.__sub__ (self,other)
 
>>> a = int(5)
>>> 3 - a
2
>>>
#self传入的是a

例二(2)
>>> class int(int):
 def __rsub__(self,other):
  return int.__sub__ (other,self)
 
>>> a = int(5)
>>> 3 - a
-2
>>>

5.增量赋值运算
__iadd__(self.other)  定义赋值加法的行为: +=

6.一元操作符
__neg__(self) 定义正号的行为:+x
__pos__(self) 定义负号的行为:-x
__abs__(self) 定义当被abs()调用时的行为
__invert__(self) 定义按位求反的行为:~x


7.其他运算符重载
__bool__              真值测试        测试对象是否为真值:bool(x)
__repr__ __str__      打印,转换      print  repr str
__contain__           成员测试        item in x
__getitem__           索引,切片      x[i] x[i:j] 没有__iter__的for循环等
__setitem__           索引赋值        x[i]=值
__delitem__           索引和分片删除  del x[i]
__len__               求长度          len(x)
__iter__ __next__     迭代            iter()  next()  for循环等

--------------------------------------------------------------------------------------------------------------------------------
常用特殊方法

方法                 功能说明
__init__()   构造函数,生成对象时调用
__del__()   析构函数,释放对象时调用
__add__()   左
__sub__()   -
__mul__()   *
__div__()__truediv__() /.x使用.x使用
__floordiv__()   整除
__mod__()   %
__pow__()   **
__cmp__()   比较运算
__repr__()   打印、转换
__setitem__()   按照索引赋值
__getitem__()   按照索引获取值
__len__()   计算长度
__call__()   函数调用
__contains__ ()   测试是否包含某个元素
__eq__()、 __ne__()、__lt__()、 __le__()、__gt__()、__ge__()    == !=  <  <=  >  >=
__str__()   转化为字符串
__lshift__()   <<
__and__()   &
__or__()        |
__invert__()    ~
__iadd__()   +=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值