赞
踩
一、魔法方法:
在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 False
-
-
- def __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.name
-
- def __ne__(self,other):
- '''
- 用于比较两个对象是否不等
- '''
- return self.age != other.age
-
- def __lt__(self,other):
- '''
- 小于
- '''
- return self.age < other.age
-
- def __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 = 0
-
- def __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.__keys
-
- def __reversed__(self):
- '''
- 容器翻转
- '''
- self.__keys.reverse()
- self.__values.reverse()
-
- def __iter__(self):
- '''
- 遍历容器时候使用
- '''
- return self
-
- def __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 = self.__values[self.__keys.index(key)]
-
- return key,value
-
- def __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 = age
-
- def __call__(self,name,age):
- self.name = name
- self.age = age
-
-
- if __name__ == "__main__":
-
- p = Person("zhangsan",18)
- p("lisi",20) # 这里调用 __call__ 方法

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。