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
英雄已阵亡
发布了23 篇原创文章 · 获赞 0 · 访问量 632

猜你喜欢

转载自blog.csdn.net/qq_43824915/article/details/102880432
今日推荐