動態給物件新增屬性和方法

2021-10-07 22:49:51 字數 4550 閱讀 3685

正常情況下,我們定義了乙個class,建立乙個class的例項後,我們可以給該例項繫結任何的屬性和方法,這就是動態語言的靈活性。

動態給物件新增屬性和方法:

class.屬性名 = 屬性值

class.方法名 = 函式

這裡說的動態加屬性和方法主要指的是關於 __slots__函式的使用

__ slots __ = (屬性名,函式名)

功能:對動態新增的屬性以及函式進行限制,只能新增元組中列舉出來的屬性名或者函式名

此限制當前類的例項起作用,對其子類不起作用.

class

person()

:#動態新增的屬性以及方法進行限制

#以元組的形式來進行列舉,將能新增的所有的函式名或者屬性名,以字串的方式列舉出來

__slots__ =

("name"

,"age"

,"say"

,'speak'

)# "name","age","say"'speak'限制例項的屬性和方法,只允許有這幾個

# 不想無限制的任意新增屬性和方法

pass

if __name__ ==

"__main__"

: per = person(

)#動態繫結屬性

per.name =

"lili"

per.age =

18print

(per.name)

print

(per.age)

# 列印結果

lili

18#動態給物件繫結函式

defsay()

:print

("say hello"

) per.say = say

per.say(

)# 列印結果

say hello

'''但是,給乙個例項繫結的屬性和方法對另外乙個例項是不起作用的。

為了給所有的例項都繫結方法,可以通過給class繫結方法

'''# 這些都會報錯,因為per1上沒有這些方法和屬性

per1 = person(

) per1.say(

)print

(per1.name)

print

(per1.age)

# 動態給類增加屬性

person.*** =

"girl"

print

(person.***)

#### 動態新增屬性和方法

per2 = person(

)print

(per2.***)

# 列印結果

girl

girl

# 動態給類增加函式(方法)

defspeak

(self, name)

: self.name = name

print

("my name is "

+ self.name)

person.speak = speak

per3 = person(

) per3.speak(

'lili'

)# 列印結果

my name is lili

通常情況下,在類中定義的所有函式(注意了,這裡說的就是所有,跟 self 啥的沒關係,self也只是乙個再普通不過的引數而已)都是物件的繫結方法,

物件在呼叫繫結方法時會自動將自己作為引數傳遞給方法的第乙個引數。

除此之外還有兩種常見的方法:靜態方法和類方法,二者是為類量身定製的,但是例項非要使用,也不會報錯。

成員方法:

通常情況下在類中定義的所有的函式,都是繫結在物件身上的,我們都稱為成員方法.

成員方法是給物件準備的,因此我們需要使用物件來進行呼叫,不能使用類名.

使用的時機:

1.使用成員變數

2.使用其他的成員的方法的時候

class

student()

:def

say(self)

:print

("**********"

)

靜態方法:

靜態方法是一類特殊的方法,有時你可能需要寫乙個屬於這個類的方法,但是這些**完全不會使用到例項物件本身,比如:

靜態方法是一種普通函式,位於類定義的命名空間中,不會對任何例項型別進行操作,python為我們內建了函式@staticmethod來把類中的函式定義成靜態方法

呼叫此方法建議使用類名, [使用物件來進行呼叫也不報錯]

使用的時機:

1.沒有用到成員變數,也沒有用類變數

2.沒有用成員方法,也不使用類方法,還沒有靜態方法

class

student()

: @staticmethod

defsay

(self)

:print

("**********"

)

@staticmethod

defspam

(x,y,z)

:#類中的乙個函式,千萬不要懵逼,self和x啥的沒有不同都是引數名

print

(x,y,z)

student.say(

) student.spam(1,

23,3)

類方法:

類方法不是繫結到物件上,而是繫結在類上的方法。

類方法是給類用的,類在使用時會將類本身當做引數傳給類方法的第乙個引數,因此呼叫的時候,我們使用

類名來進行呼叫. [使用物件來進行呼叫也不報錯]

python為我們內建了函式@classmethod來把類中的函式定義成類方法

class

test

: x=

1 @classmethod

deftest

(cls)

:print

(cls,cls.x)

test.test(

)

無論你用哪種方式訪問這個方法,它總是繫結到了這個類身上,它的第乙個引數是這個類本身

類方法中也含有乙個隱式引數[宣告的時候必須宣告,但又無需手動傳遞的引數我們稱之為隱式引數]

這個隱式引數代表類本身,通常使用cls來表示[於self類似]也是一種約定俗成的寫法.

什麼時候使用這種方法呢?類方法通常在以下兩種場景是非常有用的:

1.使用到類變數/類方法,我們可以將此方法寫成類方法

2.使用到靜態方法的時候,我們可以將此方法寫成類方法

'''

1.工廠方法:它用於建立類的例項,例如一些預處理。如果使用@staticmethod代替,

那我們不得不硬編碼pizza類名在函式中,這使得任何繼承pizza的類都不能使用我們這個工廠方法給它自己用。

'''class

pizza()

: price =

20def

__init__

(self,taste)

: self.taste = taste

@classmethod

defgetprice

(cls,size)

:return size*cls.price

'''

2.呼叫靜態類:如果你把乙個靜態方法拆分成多個靜態方法,除非你使用類方法,

否則你還是得硬編碼類名。使用這種方式宣告方法,pizza類名明永遠都不會在被直接引用,

繼承和方法覆蓋都可以完美的工作。

'''class

pizza

(object):

def__init__

(self, radius, height)

: self.radius = radius

self.height = height

@staticmethod

defcompute_area

(radius)

:return math.pi *

(radius **2)

@classmethod

defcompute_volume

(cls, height, radius)

:return height * cls.compute_area(radius)

強調,注意注意注意:靜態方法和類方法雖然是給類準備的,但是如果例項去用,也是可以用的,只不過例項去呼叫的時候容易讓人混淆,不知道你要幹啥

使用靜態方法與類方法的優點:

無需建立物件,可以直接使用類名來進行呼叫,使呼叫更加的方便.

結論:

區別,例項方法隱含的引數為類例項self,而類方法隱含的引數為類本身cls。 靜態方法無隱含引數,主要為了類例項也可以直接呼叫靜態方法。

所以邏輯上,類方法應當只被類呼叫,例項方法例項呼叫,靜態方法兩者都能呼叫。主要區別在於引數傳遞上的區別,例項方法悄悄傳遞的是self引用作為引數,而類方法悄悄傳遞的是cls引用作為引數。

vue給物件動態新增屬性和值

介紹 在vue中請求介面中,乙個請求方法可能對應後台兩個請求介面,所以請求引數就會有所不同。需要我們先設定共同的引數,然後根據條件動態新增引數屬性。let that this let params 區分普通題庫還是模考題庫 let addquestionapi if that.questiontyp...

動態新增屬性和方法

import types 新增方法的庫 新增動態方法 def lookstate self print 使用者 使用者名稱 年齡 密碼 format self.name,self.admin,self.age,self.password pass 動態新增乙個類方法 classmethod def ...

vue 給物件新增屬性

根據官方文件定義 如果在例項建立之後新增新的屬性到例項上,它不會觸發檢視更新。當你把乙個普通的 j ascript 物件傳入 vue 例項作為data選項,vue 將遍歷此物件所有的屬性,並使用object.defineproperty把這些屬性全部轉為 getter setter。受現代 j as...