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>


分享到:


相關文章: