在Python中,所有以“__”双下划线包起来的方法,如__init__,称为“Magic Method”,中文称魔术方法。下面简要介绍典型的魔术方法:
初始化__init__、构造__new__、析构__del__
<code>
class
Person
:def
__init__
(
self
, name):self
.name = name print('%s __init__ method running...'
%self
)def
__new__
(cls, *args, **kwargs)
: new_object =super
().__new__
(cls) print('__new__ method running and create new object: %s ...'
% new_object)return
new_objectdef
__del__
(
self
): print('%s __del__ method running...'
%self
) jack = Person('jack'
)/<code>结果:
__new__ method running and create new object: ...
__init__ method running...
__del__ method running...
解释:
执行__new__方法生成对象,返回值是该对象执行__init__方法完成初始化,丰富该对象对象生命周期结束或程序结束,执行__del__析构函数__str__
自定义对象的字符串表示。
<code>
class
Person
:def
__str__
(
self
): print('__str__ running...'
)return
self
.name +'--'
+self
.gender +'--'
+self
.agedef
__init__
(
self
, name, gender, age):self
.name = nameself
.gender = genderself
.age = age jack = Person('jack'
,'male'
,'18'
) print(jack)/<code>结果:
__str__ running...
jack--male--18
__dict__
<code>
class
Person
: gender ='male'
def
__init__
(self, name)
: self.name = namedef
clazz_func
(cls)
:pass
def
static_fuc
()
:pass
def
func
(self)
:pass
print(Person.__dict__) jack = Person('jack'
) print(jack.__dict__) /<code>结果:
{'__module__': '__main__',
'gender': 'male',
'__init__': ,
'clazz_func': ,
'static_fuc': ,
'func': ,
'__dict__': ,
'__weakref__': ,
'__doc__': None}
{'name': 'jack'}
__getattr__
当查找不到对象属性时调用,这里查找的范围是对象本身及类的__dict__键对应的值。
<code>
class
Person
:gender = 'male'
jack = Person() print(jack.name) # AttributeError:'Person'
object
has no attribute'name'
/<code><code>
class
Person
:def
__getattr__
(self, item)
:return
'不能找到'
+ item +'项。'
jack = Person() print(jack.name) print(jack.__doc__) /<code>__setattr__
<code>
class
Person
:def
__setattr__
(self, key, value)
: print('__setattr_ running..'
) self.__dict__[key] = value jack = Person() jack.name ='jack'
print(jack.name)/<code>结果:
__setattr_ running..
jack
__delattr__
<code>
class
Person
:def
__delattr__
(self, item)
: print('__delattr__ running.'
) self.__dict__.pop(item) jack = Person() jack.name ='jack'
del
jack.name print(jack.name) /<code>