您的位置:首页 > 编程语言 > Python开发

python进阶----魔术方法

2017-09-18 13:02 302 查看
#image魔术方法。__init__ 构造器,当一个实例被创建的时候初始化的方法。但是它并不是实例化调用的第一个方法,__new__才是实例化对象调用的第一个方法,它只取下 cls参数,并把其他参数传给 __init__。
#__new__实现的单列模式 ,__del__ 析构器,当实例被销毁时调用

class Person(object):
def __init__(self,name,age):
self.name=name
self.age = age
self.instance = add
self._registry = {
'name':name,
'age':age
}

def __new__(cls,*arg,**kwarg):
if not hasattr(cls,'instance'):
cls.instance = super(Person,cls).__new__(cls)
return cls.instance
def __call__(self,*args):  #__call__ 允许一个类的实例像函数一样被调用
return self.instance(*args)

def __getitem__(self,key): #__getitem__ 定义获取容器中指定元素的行为,相当于self[key]
if key not in self._registry.keys():
raise Exception("please registry the key : %s first ",(key,))
return self._registry[key]

def __getattr__(self,item):#__getattr__ 定义当用户试图访问一个不存在属性的时候的行为
print("don't have the attribute "+item)
return False

def __setattr__(self,key,value):#__setattr__ 定义当一个属性被设置的时候的行为
self.__dict__[key] = value

def __getattribute__(self,item):#__getattribute__ 定义当一个属性被访问的时候的行为
#注意此处不要用 self.__dict__[item]
#因为self.__dict__依然会被__getattribute__拦截 这样就会陷入循环
return object.__getattribute__(self,item)

def add(args):
return args[0]+args[1]
a =Person('p1',21)
b = Person('p2',22)
print(a==b)
print(a([1,2]))
print(a['name'],a['age'])
print(a.hh)
a.hh ='fff'
print(a.hh)

"""__delattr__ 定义当一个属性被删除的时候的行为

  __get__  定义当描述符的值被取得的时候的行为

  __set__ 定义当描述符的值被设置的时候的行为

  __delete__ 定义当描述符的值被删除的时候的行为

"""
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: