Python入門:面向對象之典型魔術方法

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

def

__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...

解釋:

  1. 執行__new__方法生成對象,返回值是該對象
  2. 執行__init__方法完成初始化,豐富該對象
  3. 對象生命週期結束或程序結束,執行__del__析構函數

__str__

自定義對象的字符串表示。

<code>

class

Person

:

def

__str__

(

self

): print(

'__str__ running...'

)

return

self

.name +

'--'

+

self

.gender +

'--'

+

self

.age

def

__init__

(

self

, name, gender, age):

self

.name = name

self

.gender = gender

self

.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 = name

def

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>


分享到:


相關文章: