python进阶----魔术方法

#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__ 定义当描述符的值被删除的时候的行为

"""


你可能感兴趣的:(python进阶)