#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进阶----魔术方法
最新推荐文章于 2024-04-29 10:00:00 发布