一、魔法方法:
在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中魔法方法】