從零開始學Python-Day43-面向對象高級編程-使用__slots__

當我們定義了類class並創建它的實例之後,我們可以給這個實例綁定任何屬性和方法,這就是動態語言的靈活性。

我們定義一個class:

<code>

class

Student

(object)

:

pass

/<code>

給創建的實例綁定屬性:

<code> > s = Student()
 > s.name = 

'Woodman'

> print(s.name) Woodman/<code>

也可以給實例綁定方法:

<code> > 

def

set_age

(

self

, age): self.age = age > from types import MethodType > s.set_age = MethodType(set_age, s) > s.set_age(

35

) > s.age

35

/<code>

需要注意的是,給一個實例綁定的屬性和方法對同一個類的其他實例是不起作用的,這個其實也很好理解,如果要給所有實例都綁定屬性或方法就需要對class類去綁定。

<code> > s2 = Student()
 > s2.set_age( 

33

) Traceback (most recent call last): File

""

, line

1

,

in

<

module

> s2.set_age(

33

)

AttributeError:

'Student'

object has no attribute

'set_age'

/<code>

給class綁定屬性和方法後,其他實例均可調用:

<code> > 

def

set_score

(

self

, score): self.score = score > Student.set_score = set_score > s.set_score(

100

) > s.score

100

> s2.set_score(

60

) > s2.score

60

/<code>

上面的set_score方法可以直接定義在class中,但動態綁定允許我們在程序運行的過程中動態給class加上功能,這在靜態語言中很難實現。

__slots__

但是,如果我們想要限制實例的屬性怎麼辦?比如,只允許對Student實例添加name和age屬性。為了達到限制的目的,Python允許在定義class的時候,定義一個特殊的__slots__變量,來限制該class實例能添加的屬性:

<code> > 

class

Student

(

object

): __slots_

_

= (

'name'

,

'age'

) > s = Student() > s.name =

'Woodman'

> s.age =

35

> s.score =

100

Traceback (most recent call last): File

""

, line

1

,

in

<

module

> s.score =

100

AttributeError:

'Student'

object has no attribute

'score'

/<code>

可以看到,由於做了slots限制,score這一屬性添加不上去,使用__slots__要注意,__slots__定義的屬性僅對當前類實例起作用,對繼承的子類不起作用:

<code> > 

class

GraduatStudent

(

Student

): pass > g = GraduatStudent() > g.score =

100

/<code>

除非在子類中也定義__slots__,這樣,子類實例允許定義的屬性就是自身的__slots__加上父類的__slots__。


分享到:


相關文章: