python中魔法方法

一、魔法方法:
在python中 有一些方法以两个下划线开头和结尾,这些方法会在合适的时机进行调用(解释器自行调用),我们把这一类方法称为魔法方法。
二、类中常用的魔法方法:

''' __new__()、__init__()、__del__()、__str__()、__repr__() __setattr__、__getattr__、__delattr__、__getattribute__ __eq__、__ne__、__lt__、__gt__ ''' class Person(object):def __new__(cls,*args,**kwargs): ''' 1.该方法 为实例化对象时候第一个调用的方法, 2.该方法 的返回值为对象实例则 调用构造方法__init__(),否则不调用构造方法 ''' print("__new__ 方法被调用...")return super().__new__(cls) #这里通过父类的 __new__方法 返回对象实例,因此这里会调用构造方法def __init__(self,name,age): ''' 该方法 用于构造对象,对象初始化 ''' self.name = name self.age = age print("__init__ 方法被调用...")def __del__(self): ''' 该方法 在销毁对象时候自动被调用 ''' print("__del__ 方法被调用...")def __str__(self): ''' 该方法用于显示对象信息,当调用print 打印该对象时候,会调用该方法 ''' return "我叫:" + self.name + ", 今年" + str(self.age) + "岁了."def __repr__(self): ''' 该方法用于显示对象信息,当调用print 打印该对象时候,会调用该方法,区别在于 该方法是 给解释器 看的,__str__ 是给 人看的 当重写 __str__ 后,print 打印对象 将 不会 调用 __repr__一般这样写: 重写 __str__ 后 __repr__ = __str__ ''' return "我叫:" + self.name + ", 今年" + str(self.age) + "岁了."def __bool__(self): ''' 该方法 调用 bool 时候 会自动调用:对象.bool ''' return Ture if self.age > 18 Falsedef __setattr__(self,key,value): ''' 该方法为 父类方法: 当属性被设置时候 自动调用 ''' if key not in ("name","age"): return if key == "age" and value < 0: return ValueError() super(Person,self).__setattr__(key,value)def __getattr__(self,key): ''' 访问某个不存在的属性 调用 ''' return "not exit"def __delattr__(self,key): ''' 删除某个属性时候调用 ''' if key == "name": raise AttributeError() super().__delattr__(key)def __getattribute__(self,key): ''' 所有属性/方法调用都经过这里,属于类方法 ''' return super().__getattribute__(key)def __eq__(self,other): ''' 用于比较两个对象的是否相等 p1 == p2 ''' return self.name = other.namedef __ne__(self,other): ''' 用于比较两个对象是否不等 ''' return self.age != other.agedef __lt__(self,other): ''' 小于 ''' return self.age < other.agedef __gt__(self,other): ''' 大于 ''' return self.age > other.age

三、容器中常用魔法方法
''' __setitem__、__getitem__、__delitem__、__len__、__iter__、__contains__、__reversed__ '''class MyDict(object): ''' 使用列表模拟 字典数据结构 '''def __init__(self): self.__keys = [] self.__values = [] self.__pos = 0def __setitem__(self,key,value): ''' 设置容器中元素的行为 ''' if key in self.keys: self.__values[self.keys.index(key)] = value else: self.__keys.append(key) self.__values.append(value)def __getitem__(self,key): ''' 获取元素行为 ''' if key in self.keys: return self.__keys[self.__keys.index(key)],self.__values[self.__keys.index(key)]def __len__(self): ''' 容器的长度 ''' return len(self.__keys)def __contains__(self,key): ''' 容器成员运算 ''' return key in self.__keysdef __reversed__(self): ''' 容器翻转 ''' self.__keys.reverse() self.__values.reverse()def __iter__(self): ''' 遍历容器时候使用 ''' return selfdef __next__(self):''' 遍历容器时候 __iter__ 返回值为 self 则要重写 __next__ 方法 返回值为 iter(obj) obj为内置对象,则使用obj 对象的__next__ 方法 ''' if self.__pos > len(self.__keys) - 1: raise StopIterIteration() key = self.__keys[self.__pos] value = https://www.it610.com/article/self.__values[self.__keys.index(key)]return key,valuedef __delitem__(self,key):''' 删除 容器元素 时调用 ''' if key in self.__keys: del self.__values[self.__keys.index(key)] del self.__keys[self.__keys.index(key)]

四、可调用的对象
''' __call__ '''class Person(object):def __init__(self,name,age): self.name = name self.age = agedef __call__(self,name,age): self.name = name self.age = ageif __name__ == "__main__":p = Person("zhangsan",18) p("lisi",20) # 这里调用 __call__ 方法

【python中魔法方法】

    推荐阅读