魔术方法

  • python中所有以__包起来的方法都可以成为魔术方法
  1. __init__() 对象的初始化操作
  2. __new__() 创建类并且返回类的实例
  3. 这两个方法共同构成了构造函数
  4. __del__() 对象生命周期结束的时候会调用
  • 不可变容器只能定义__len__() __getitem__()
  • 可变容器可以定义的魔术方法包含了不可变容器的所有魔术方法,另外还包含 __setitem__() __delitem__() 如果希望可以迭代还需要定义  __iter__()  __next__()

常见魔术方法含义:

  1. __len__(self): 返回容器的长度
  2. __getitem__(self, key): 根据key返回访问的某一项的内容,重写该方法可以向访问列表一样使用下标的形式来访问对应的元素。
  3. __setitem__(self, key, value): 设置值
  4. __delitem__(self, key): 删除某一项的时候调用
  5. __iter__(self): 返回对象本身
  6. __reversed__(self): 返回序列反转后的版本
  7. __contains__(self, item): 判断某个元素是否存在 in, notin
  8. __missing__(self, key): dict类中包含有该方法,定义了在容器中找不到时触发的行为。例如 字典d = {1:3} 当执行d[not_exists_item]时,d.__missing__('not_exists_key')会被执行
  9. __str__(self): 在print该对象时调用此方法,或者str(对象时调用)
#借助以上魔术方法实现类似于list的数据结构
class Funclist:
	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 Funclist(reversed(self.values))
		
	def append(self, value):
		self.values.append(value)
		
	def head(self):
		return self.values[0]
		
	def tail(self):
		return self.values[1:]
		
	def last(self):
		return self.values[-1]
		
	def drop(self, n):
		return self.values[n:]
	
	def take(self, n):
		return self.values[:n]

反射

  • __instancecheck__(self, instance):    检查一个实例是不是你定义类的实例
  • __subclasscheck__(self, subclass):   检查一个类是不是你定义的子类

可调用对象

  •     __call__(self, [args...]):    这种方式允许类的实例像函数一样来调用例如 x() x.__call__()
  •     __call__的用法类的实例状态经常改变的时候会用到
class Entity:
	'''
	调用实例改变实例位置
	'''
	def __init__(self, size, x, y):
		self.size = size
		self.x, self.y = x, y
		
	def __call__(self, x, y):
		'''
		改变实例位置
		'''
		self.x, self.y = x, y

比较方法__eq__()

常见比较方法 is 和 == 

is: 比较两个对象的内存地址是否相同

== :比较两个对象的内容是否相等

比较序列是否相同

lst1 = [1,2,3]

lst2 = [1,2,3]

print(lst1 == lst2) # 运行值True

print(lst1 is lst2) #运行值False

当实例化两个对象obj1,obj2此时返回均是false,若想修改这种比较方式要重写类中的__eq__(self, other)

例子

class Ps:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __eq__(self, other_obj):
        return self.__dict__ == other_obj.__dict__

ps1 = Ps('lisi',10)
ps2 = Ps('lisi',10)

print(ps1 is ps2)# False
print(ps1 == ps2)#True

__hash__()

在数据结构中主要用来返回一个对象的哈希值

set集合中的元素要求都是可以hash的,set集合会默认调用__hash__()方法进行快速查询得到hash值后调用__eq__方法比较,如果相同不添加,不相同则添加。

__dict__

  • 存放数据的字典
  • 类__dict__属性:
  1. 这个属性里面主要存储了静态函数,类函数,普通函数,全局变量,以及一些内置属性
  2. 父类子类共用__dict__属性
  • 对象__dict__属性: 存储self.xxxx的某些东西
class Ps:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __eq__(self, other_obj):
        print("self.__dict__",self.__dict__)
        return self.__dict__ == other_obj.__dict__

print(Ps.__dict__)
ps2 = Ps('lisi',10)
print(ps2.__dict__)

====================================输出如下========================================
{'__module__': '__main__', '__init__': <function Ps.__init__ at 0x7f2f3a74bea0>, '__eq__': <function Ps.__eq__ at 0x7f2f3a759048>, '__dict__': <attribute '__dict__' of 'Ps' objects>, '__weakref__': <attribute '__weakref__' of 'Ps' objects>, '__doc__': None, '__hash__': None}
{'name': 'lisi', 'age': 10}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值