Python常见魔法方法
__new__
- 创建实例
- 在实例化过程中先调用
__new__
创建实例,再调用__init__
初始化实例 __new__
参数是类本身,返回的是创建的实例
class Py(object):
def __new__(cls, *args, **kwargs):
print 'new'
new_object = super(Py, cls).__new__(cls, *args, **kwargs)
print new_object
return new_object
def __init__(self, *args, **kwargs):
print 'init'
self.name = 'lisi'
test = Py()
print test.name
new
<__main__.Py object at 0x000000000396FAC8>
init
lisi
__init__
- 实例初始化,给刚创建的实例增加属性,见
__new__
__del__
class Py(object):
def __new__(cls, *args, **kwargs):
print 'new'
return super(Py, cls).__new__(cls, *args, **kwargs)
def __init__(self):
print 'init'
self.name = 'lisi'
def __del__(self):
print 'delete object'
test = Py()
new
<__main__.Py object at 0x000000000361FBA8>
init
delete object
__setattr__
class Py(object):
def __init__(self):
self.name = 'lisi'
def __setattr__(self, key, value):
print '属性名:{}, 属性值:{}'.format(key, value)
super(Py, self).__setattr__(key, value)
test = Py()
test.name = 'zhangsan'
属性名:name, 属性值:lisi
属性名:name, 属性值:zhangsan
__getattribute__
- 访问实例属性、方法时调用
- item 为属性名或方法名
class Py(object):
def __init__(self):
self.name = 'lisi'
def __getattribute__(self, item):
print '__getattribute__'
print item
return super(Py, self).__getattribute__(item)
def func(self):
return 'func_str'
test = Py()
print test.name
print test.func()
__getattribute__
lisi
lisi
__getattribute__
func
func_str
- 尽量不要重写,防止进入无限循环,如下:name != ‘a’,会访问self.age, 访问self.age属性会先访问
__getattribute__
,如此进入循环
class Py(object):
def __init__(self):
self.name = 'lisi'
self.age = 12
def __getattribute__(self, item):
print '__getattribute__'
if item == 'a':
return super(Py, self).__getattribute__(item)
else:
return self.name
test = Py()
print self.name
__getattr__
- 当访问
不存在的属性、方法
时先调用__getattribute__
再调用__getattr
- 抛出 AttributeError
class Py(object):
def __getattr__(self, item):
return '__getattr__,属性or方法不存在'
def __getattribute__(self, item):
print '__getattribute__'
return super(Py, self).__getattribute__(item)
test = Py()
print test.age
__getattribute__
__getattr__,属性or方法不存在
__delattr__
class Py(object):
def __init__(self):
self.name = 'lisi'
def __delattr__(self, item):
print '__delattr__', item
return super(Py, self).__delattr__(item)
test = Py()
del test.name
__delattr__ name
__str__
class Py(object):
def __init__(self):
self.name = 'lisi'
def __str__(self):
return '__str__'
test = Py()
print test
__str__
__call__
class Py(object):
def __init__(self):
self.name = 'lisi'
def __call__(self, *args, **kwargs):
return '__call__'
test = Py()
print test()
__call__
__dict__
class Py(object):
def __init__(self):
self.name = 'lisi'
self.age = 12
print(Py().__dict__)
{'name': 'lisi', 'age': 12}
setattr(), getattr(), hasattr()函数
object 类或对象
当 object 为对象时:
setattr == __setattr__,
getattr == __getattr__,
delattr == __delattr__,
setattr(object, name, value)
getattr(object, 'func/attr')
hasattr(object, 'func/attr')
delattr(object, 'func/attr')