Python基础11.魔法方法

python3.7魔法方法

定义:

魔术方法,指python中所有以”__”(双下划线)作为名字开头和结尾的方法。它们也被称为“dunders”。我们最常用到的应该就是“init

魔术方法简介
方法描述
–del–析构函数,释放对象时使用
–repr–打印转换
–setitem–按照索引赋值
–getitem–按照索引取值
–len–获取长度
–cmp–比较运算
–call–函数调用
–add–加运算
–sub–减运算
–mul–乘运算
–truediv–除运算
–mod–求余运算
–pow–指数运算
–and–按位与运算
–xor–按位异或运算
–or–按位或运算
实例1
class Vector:
	def __init__(self, a, b):
  		self.a = a
  		self.b = b

	def __str__(self):
  		return 'Vector (%d, %d)' % (self.a, self.b)

	def __add__(self,other):
  		return Vector(self.a + other.a, self.b + other.b)
  		
  	def __and__(self,other):
		return Vector(self.a & other.a, self.b & other.b)

v1 = Vector(2,3)
v2 = Vector(4,5)
print (v1 + v2)
print (v1 & v2)
结果:
Vector (6, 8)
Vector (0, 1)

实现了类与类之间的运算.。需要注意的是,两个类要同类型。

实例2

构造自定义容器,在Python中,常见的容器类型有: dict, tuple, list, string。
其中tuple, string是不可变容器,dict, list是可变容器。
可变容器和不可变容器的区别在于,不可变容器一旦赋值后,不可对其中的某个元素进行修改。

class Person:
	def __init__(self,persion_list):
		self.persion_list=persion_list
	def __setitem__(self,item,value):       #赋值
		self.persion_list[item]=value
	def __getitem__(self, item):          #取值
		return self.persion_list[item]
	def __len__(self):                     #长度
		return len(self.persion_list)

body=Person(["Xiuwu","Adny","Maggie"])
print(body[1])
body[1]='apple'
print(body[1])
print(len(body))
结果:
Adny
apple
3
实例3
classFunctionalList:
	def__init__(self, values=None):
    	if values is None:
        	self.values = []
    	else:
        	self.values = values

	def__len__(self):
    	return len(self.values)

	def__getitem__(self, key):
    	return self.values[key]

	def__setitem__(self, key, value):
    	self.values[key] = value

	def__delitem__(self, key):
    	del self.values[key]

	def__iter__(self):           
    	return iter(self.values)

	def__reversed__(self):
    	return FunctionalList(reversed(self.values))

	defappend(self, value):
    	self.values.append(value)
    	
	defhead(self):                     # 获取第一个元素
    	return self.values[0]
    	
	deftail(self):                  # 获取第一个元素之后的所有元素
    	return self.values[1:]
    	
	definit(self):                        # 获取最后一个元素之前的所有元素
    	return self.values[:-1]
    	
	deflast(self):            # 获取最后一个元素
    	return self.values[-1]
    	
	defdrop(self, n):                   # 获取所有元素,除了前N个
    	return self.values[n:]
    	
	deftake(self, n):             # 获取前N个元素
    	return self.values[:n]

Python3中的del方法:

  • 在对象的生命周期结束时, __del__会被调用,可以将__del__理解为"析构函数".
    __del__定义的是当一个对象进行垃圾回收时候的行为

  • 在定义的类中存在__del__方法时,当类被删除的时候,程序会自动执行__del__当中的代码(正好与__init__方法相反).

     代码1:
     class Hero:
     	def __del__(self):
     		print("英雄已阵亡")
    
     man1 = Hero()
     man2 = man1
     del man1
     del man2
     print("程序执行完毕")
     结果:
     英雄已阵亡          #两个类引用(man1,man2)都被删除,执行del代码,再执行print
     程序执行完毕
    

代码中指向类的有两个,分别是man1和man2,当删除man1时,Hero()类的引用并没有完全删除掉,当把man2也删除后,指向Hero类的指针为0,此时才真正删除了Hero类.可以对比一下两个代码运行的结果.

代码2:
class Hero:
	def __del__(self):
    	print("英雄已阵亡")

man1 = Hero()
man2 = man1
del man1
print("程序执行完毕")
结果:
程序执行完毕          #只删除了一个类(man1),hero()并没有真正删除,故先执行print,等对象生命周期结束(程序结束),自动删除类的引用,执行del
英雄已阵亡
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值