- python中所有以__包起来的方法都可以成为魔术方法
- __init__() 对象的初始化操作
- __new__() 创建类并且返回类的实例
- 这两个方法共同构成了构造函数
- __del__() 对象生命周期结束的时候会调用
- 不可变容器只能定义__len__() __getitem__()
- 可变容器可以定义的魔术方法包含了不可变容器的所有魔术方法,另外还包含 __setitem__() __delitem__() 如果希望可以迭代还需要定义 __iter__() __next__()
常见魔术方法含义:
- __len__(self): 返回容器的长度
- __getitem__(self, key): 根据key返回访问的某一项的内容,重写该方法可以向访问列表一样使用下标的形式来访问对应的元素。
- __setitem__(self, key, value): 设置值
- __delitem__(self, key): 删除某一项的时候调用
- __iter__(self): 返回对象本身
- __reversed__(self): 返回序列反转后的版本
- __contains__(self, item): 判断某个元素是否存在 in, notin
- __missing__(self, key): dict类中包含有该方法,定义了在容器中找不到时触发的行为。例如 字典d = {1:3} 当执行d[not_exists_item]时,d.__missing__('not_exists_key')会被执行
- __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__属性:
- 这个属性里面主要存储了静态函数,类函数,普通函数,全局变量,以及一些内置属性
- 父类子类共用__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}