最近发现同学们的问题放弃了统一,都是在问我一些魔法办法的应用及意义,所以在这里也是专门给大家整顿一份魔法办法的详解及应用汇合。
家喻户晓,办法是须要调用执行的,而魔法办法则不一样,他无需你的调用,在特定的时候会本人执行。
__init__办法
__init__办法是类在创立实例的那一瞬间,就会默认调用的办法,而定义在这个办法里的属性,咱们称它为初始化属性,多说无益,咱们间接上代码。
class Person(object): def __init__(self): print('大家好,我是渣渣辉')p1 = Person()···执行后果:大家好,我是渣渣辉
__new__办法
大家方才看到了这个__init__办法的成果,必定都会认为这个办法是类中第一个执行的办法,其实并不然,咱们的类最开始调用的是__new__办法,它的第一参数是它的类对象,其余的参数则是传递给__init__办法的,,_new__办法能够调用其余的类的办法或者返回别的实例来作为以后类的实例,所以如果__new__办法没有返回实例,那么__init__办法就不会被调用,所以__new__办法决定了__init__办法是否应用,也能够说实例就是__new__办法创立的。__new__办法的主要用途是当你继承了一些不可更改的属性的时候,给你提供一个路径去批改它。
class Person(int): def __new__(cls, value): return super(Person, cls).__new__(cls, abs(value))p1 = Person(-1)print('p1 = ', p1)执行后果:p1 = 1
__str__办法
__str__办法是用来显示信息的,通常是用来返回一个字符串,作为这个实例对象的形容信息,它只有一个参数,须要return一个数据,当你在类的内部打印实例对象的时候则会打印这个数据,在应用print(对象)或者str(对象)的时候会触发此办法。
class Person(object): def __init__(self): self.name = '渣渣辉' self.age = 18 def __str__(self): return '我是%s,往年%s,快来砍我' % (self.name, self.age)p1 = Person()print(p1)执行后果:我是渣渣辉,往年18,快来砍我
在应用print()函数输入对象名称的时候默认的状况会打印对象名援用的内存地址,如果想要打印对象的属性值,能够应用__str__(self)这个办法。
__call__办法
__call__办法能够是类的实例对象能像调用函数那样应用对象。它的作用是简化了对象下办法的应用,含糊了对象和函数调用时的区别。
应用__call__前class Person(object): def demo(self): print('p1')p1 = Person()p1.demo()执行后果:p1
应用__call__后class Person(object): def __call__(self): print('p1')p1 = Person()p1()执行后果:p1
应用__call__办法实现斐波那契数列
class Fibonacci(object): def __call__(self, num): a, b = 1, 1 self.lst = [] if num <= 2: self.lst.append(a) self.lst.append(b) else: for i in range(1, num + 1): self.lst.append(a) a, b = b, a + b return self.lstfibo = Fibonacci()ret = fibo(10)print(ret)执行后果:[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
__dir__办法
相熟python的人都晓得dir()办法能够让咱们查看以后环境下有些什么样的办法和属性能够应用,通过dir(object)能够取得一个对象领有的办法和属性,同样的情理,如果咱们本人在类中定义了这个__dir__办法,咱们就能够指定一些他人可能被调用的办法,你的协同开发者就能够通过调用dir()办法查看到并应用。
class Person(object): def __init__(self): self.name = '渣渣辉' self.age = 18 self.gender = '男' def chuanqi(self): print('快来和我一起砍传奇') p1 = Person()print(dir(p1))执行后果:['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'chuanqi', 'gender', 'name']
__del__办法
在一个实例被销毁时,__del__办法会执行,该办法是解释器主动调用的,个别不须要重写。
class Person(object): def __del__(self): print("销毁") print("主动调用del")p1 = Person()执行后果:销毁主动调用del
__getattr__办法
当咱们拜访一个不存在的属性时会调用次办法,如果属性存在则不调用。
如果咱们不重写__getattr__办法,当咱们拜访一个不存在的属性时会抛出AtrributeError的谬误。
class Person(object): def __init__(self,name): self.name = name def __getattr__(self, item): print("不存在的属性") return itemp1 = Person("渣渣辉")print(p1.name)print(p1.age)#age属性不存在执行后果:渣渣辉不存在的属性age
__setattr__办法
所有的属性设置都会调用此办法,并且只有领有这个魔法办法的对象才能够设置属性,应用这个办法要留神的是不要被循环调用。
class Person(object): def __init__(self, name): self.name = name def __setattr__(self, name, value): print("执行__setattr__") object.__setattr__(self, name, value)p1 = Person("渣渣辉")print(p1.name)执行后果:执行__setattr__渣渣辉
__dict__办法
__dict__办法能够被认为是一个管理系统,它治理着类中存储的各种属性,当咱们创立类属性或者实例属性的时候,就会将这些信息保留到__dict__魔法办法外部,咱们应用的时候再从它外部取出来。当咱们用实例对象点上__dict__的办法时,就能够读取到以后实例对象的属性。
class Person(object): def __init__(self): self.name = '渣渣辉' self.age = 18 self.gender = '男'p1 = Person()print(p1.__dict__)执行后果:{'name': '渣渣辉', 'age': 18, 'gender': '男'}
__eq__办法
在做对象比拟的时候,咱们实际上调用的办法就是__eq__办法,默认比拟的是内存地址,如果要扭转比拟形式,能够重写__eq__办法。
class Person(object): def __init__(self, name, age): self.name = name self.age = age def __eq__(self, other): return self.__dict__ == other.__dict__per1 = Person('lee', 10)per2 = Person('lee', 10)print(per1 == per2)print(per1 is per2)执行后果:TrueFalse
这些就是咱们常常可能用到的魔法办法,心愿大家可能有所得,记得献上你们的小红心哦!!!