在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>