動態繫結和 slots

2022-08-14 19:06:10 字數 1733 閱讀 6413

#

python 是動態程式語言,可以在執行的過程中修改**,不需要編譯就可以直接執行

#綜合:動態繫結類屬性和類方法,物件屬性和物件方法

class

test01(object):

def__init__

(self, name):

self.name =name

defeat(self):

print("

%s 正在吃放

" %self.name)

defrun(self):

print("

%s 想要奔跑

" %self.name)

defplay(self):

print("

%s 正在玩耍

" %self.name)

t1 = test01("張三"

)print

(t1.name)

#動態新增例項屬性

t1.age = 15

print

(t1.age)

print("

*" * 60)

#動態新增例項方法,如果直接使用

#t1.run = run

#t1.run()

#是不對的,為什麼呢?run()方法需要傳self引數,直接這麼寫,run()並沒有傳引數,不是物件t1的例項方法

#正解:

import

types

t1.run =types.methodtype(run, t1)

t1.run()

print("

*" * 60)

#動態新增類屬性(這樣所有的物件例項都可以使用這個屬性了)

t2 = test01("李四"

)t3 = test01("王五"

)test01.add = "北京"

print

(t2.add)

print

(t3.add)

print("

*" * 60)

#動態新增類方法(靜態方法也是一樣)

test01.play =play

t2.play()

t3.play()

print("

*" * 60)

#補充:動態刪除類屬性

#del 物件.屬性名

#delattr(物件, "屬性名")

#補充:如何限定例項物件只能動態的新增某些指定的屬性呢?

#為了達到限制的目的,python允許在定義class的時候,定義乙個特殊的__slots__變數,來限制該class例項能新增的屬性

#注意:使用__slots__要注意,__slots__定義的屬性僅對當前類例項起作用,對繼承的子類是不起作用的

class

person(object):

#必須把name也新增到__slots__,不然會找不到該屬性

__slots__ = ("

name

", "

age", "

add"

)p =person()

p.age = 15p.add = "長沙"

print(p.age, "

====

", p.add)

#以上都沒有報錯,因為name、age、add都是在範圍裡的

p.score = 100

print

(p.score)

#沒有score

靜態繫結和動態繫結

c 中,非虛函式都是靜態繫結,而虛函式卻是動態繫結。為了能夠更清楚地了解靜態繫結與動態繫結,我們可以看下面這個例子 include using namespace std class b 那麼兩次呼叫fun 函式是否相同呢?當然,如果d中沒有定義fun 函式 如例子中 那麼兩次呼叫的行為肯定會是一樣...

靜態繫結和動態繫結

物件的靜態型別 物件在宣告是採用的型別,在編譯期確定 物件的動態型別 當前物件所指的型別,在執行期決定,物件的動態型別可以更改,但靜態型別無法更改。靜態繫結 繫結的是物件的靜態型別,某特性 比如函式 依賴於物件的靜態型別,發生在編譯期。動態繫結 繫結的是物件的動態型別,某特性 比如函式 依賴於物件的...

C 靜態繫結和動態繫結

c 為了支援多型性,才用了動態繫結和靜態繫結。首先理解四個名詞 1.物件的靜態型別 物件在宣告時採用的型別,是在編譯期確定的。2.物件的動態型別 目前所指物件的型別,是在執行期決定的。class b class c public b class d public b d pd new d pd的靜態...