日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【Python】 如何動(dòng)態(tài)添加類(lèi)屬性與方法

 LibraryPKU 2020-02-15

一些概念

涉及到一些基礎(chǔ)概念,本章要討論的相關(guān)術(shù)語(yǔ)。但是有些概念又是一時(shí)半會(huì)講不清楚,所以筆者盡量找到簡(jiǎn)練形象的描述,并附上參考鏈接。 

  • 對(duì)象
  • 屬性
  • 方法
  • 類(lèi)
  • 實(shí)例

 

類(lèi)(1) - 《零基礎(chǔ)學(xué)python》(第二版):https://docs./learnpython/206/

 

對(duì)象(object):在面向?qū)ο缶幊讨校∣OP),萬(wàn)物都是對(duì)象。對(duì)象應(yīng)該具有屬性(就是上面的狀態(tài),因?yàn)閷傩愿S茫?、方法(就是上面的行為,方法跟常被使用)和?biāo)識(shí)。

既然萬(wàn)物都是對(duì)象,那么,某個(gè)具體的人也是對(duì)象,這是當(dāng)然的事情。假設(shè)這個(gè)具體的人就是德藝雙馨的蒼老師,她是一個(gè)對(duì)象。這個(gè)蒼老師具有哪些特征呢?我錯(cuò)了,寫(xiě)到這里發(fā)現(xiàn)不能用蒼老師為對(duì)象的例子,因?yàn)槿菀鬃屪x者不專(zhuān)心學(xué)習(xí)了。我換一個(gè)吧,以某個(gè)王美女為對(duì)象說(shuō)明(這個(gè)王美女完全是虛構(gòu)的,請(qǐng)不要對(duì)號(hào)入座,更不要想入非非,如果雷同,純屬巧合)

 

屬性:即狀態(tài)(state),包括這個(gè)對(duì)象已有的屬性(通常是類(lèi)里面已經(jīng)定義好的)在加上對(duì)象具有的當(dāng)前屬性值(這些屬性往往是動(dòng)態(tài)的)

王美女這個(gè)對(duì)象具有某些特征,眼睛,大;腿,長(zhǎng);皮膚,白。當(dāng)然,既然是美女,肯定還有別的顯明特征,讀者可以自己假設(shè)去。如果用“對(duì)象”的術(shù)語(yǔ)來(lái)說(shuō)明,就說(shuō)這些特征都是她的屬性。也就是說(shuō)屬性是一個(gè)對(duì)象做具有的特征,或曰:是什么。。

 

方法:即行為(behavior),是指一個(gè)對(duì)象如何影響外界及被外界影響,表現(xiàn)為對(duì)象自身狀態(tài)的改變和信息的傳遞。

王美女除了具有上面的特征之外,她還能做一些事情,比如她能唱歌、會(huì)吹拉彈唱等。這些都是她能夠做的事情。用“對(duì)象”的術(shù)語(yǔ)來(lái)說(shuō),就是她的“方法”。即方法就是對(duì)象能夠做什么。

 

類(lèi):在面向?qū)ο蟪淌皆O(shè)計(jì),類(lèi)(class)是一種面向?qū)ο笥?jì)算機(jī)編程語(yǔ)言的構(gòu)造,是創(chuàng)建對(duì)象的藍(lán)圖,描述了所創(chuàng)建的對(duì)象共同的屬性和方法。

首先要明確,類(lèi)是對(duì)某一群具有同樣屬性和方法的對(duì)象的抽象。比如這個(gè)世界上有很多長(zhǎng)翅膀并且會(huì)飛的生物,于是聰明的人們就將它們統(tǒng)一稱(chēng)為“鳥(niǎo)”——這就是一個(gè)類(lèi),雖然它也可以稱(chēng)作“鳥(niǎo)類(lèi)”。

 

實(shí)例:類(lèi)僅僅是對(duì)物體的抽象描述,并不是某個(gè)具體物件.。由類(lèi)變成一個(gè)實(shí)例的過(guò)程叫做類(lèi)的實(shí)例化。

在編程界,有這樣一句話,說(shuō)“類(lèi)是實(shí)例工廠”,什么意思呢?工廠是干什么的?生產(chǎn)物品,比如生產(chǎn)電腦。一個(gè)工廠可以生產(chǎn)好多電腦。那么,類(lèi),就能“生產(chǎn)”好多實(shí)例,所以,它是“工廠”。

 

定義時(shí)添加

通常在定義類(lèi)的時(shí)候,添加屬性和方法。


  1. class Person(object): #創(chuàng)建類(lèi)
  2. def __init__(self, name): #構(gòu)造函數(shù)
  3. self.name = name

  4. def getName(self): #類(lèi)中的方法(函數(shù))
  5. return self.name

  6. def color(self, color):
  7. print "%s is %s" % (self.name, color)

  8. girl = Person('canglaoshi') #實(shí)例化
  9. name = girl.getName() #調(diào)用方法(函數(shù))
  10. print "the person's name is: ", name
  11. girl.color("white") #調(diào)用方法(函數(shù))

  12. print "------"
  13. print girl.name #實(shí)例的屬性

__init__()是構(gòu)造函數(shù),在類(lèi)實(shí)例化之后,就立即執(zhí)行了這個(gè)構(gòu)造函數(shù)。作為首次初始化使用。

self 類(lèi)里面的函數(shù),第一個(gè)參數(shù)是self。在類(lèi)內(nèi)部,就是將所有傳入的數(shù)據(jù)都賦給一個(gè)變量,通常這個(gè)變量的名字是self。也就是說(shuō),self接收實(shí)例化的所有數(shù)據(jù),self就是一個(gè)實(shí)例。

在函數(shù)外部,類(lèi)的實(shí)例化對(duì)象 girl 和函數(shù)內(nèi)部的slef是一回事。girl.name 相當(dāng)于 slef.name

 

保存并運(yùn)行

  1. $ python 20701.py
  2. the person's name is: canglaoshi
  3. canglaoshi is white
  4. ------
  5. canglaoshi

 

動(dòng)態(tài)添加

 

有些情況沒(méi)有在定義類(lèi)是添加它的屬性或者方法(比如,我們使用第三方函數(shù)庫(kù)的時(shí)候)。但可以通過(guò)動(dòng)態(tài)的方法,在程序執(zhí)行的過(guò)程中添加。

 

動(dòng)態(tài)添加屬性

第一種:使用對(duì)象名.屬性名添加,示例如下:

    p.age = 18


第二種:使用setattr函數(shù)添加,示例如下:

  1.  if not hasattr(p,'age'):
  2.      setattr(p,'age',18)

hasattr是用來(lái)判斷一個(gè)對(duì)象是否有某個(gè)屬性,而setattr是用來(lái)給某個(gè)對(duì)象添加屬性,并且指定這個(gè)屬性的值。

 

 

動(dòng)態(tài)添加方法

 

動(dòng)態(tài)添加實(shí)例方法:


使用types.MethodType這個(gè)方法了,示例代碼如下:

  1. import types
  2. class Person(object):
  3.     def __init__(self,name):
  4.         self.name = name

  5. def run(self):
  6.     print('%s在奔跑' % self.name)

  7. p1 = Person('p1')
  8. p1.run = types.MethodType(run,p1)

  9. p1.run()


其中types.MethodType的第一個(gè)參數(shù)是這個(gè)函數(shù)本身,第二個(gè)參數(shù)是在調(diào)用run這個(gè)函數(shù)的時(shí)候,傳給run方法的第一個(gè)參數(shù)。

 

動(dòng)態(tài)添加類(lèi)方法:

添加類(lèi)方法,是把這個(gè)方法添加給類(lèi)。因此添加類(lèi)方法的時(shí)候不是給對(duì)象添加,而是給類(lèi)添加。

直接將這個(gè)函數(shù)賦值給類(lèi)就可以了,但是需要使用classmethod裝飾器將這個(gè)方法設(shè)置為一個(gè)類(lèi)方法。示例代碼如下:

  1. import types

  2. class Person(object):
  3.     country = 'china'
  4.     def __init__(self,name):
  5.         self.name = name

  6. @classmethod
  7. def run(cls):
  8.     print('%s在奔跑' % cls.country)

  9. Person.run = run
  10. Person.run()


動(dòng)態(tài)添加靜態(tài)方法:


添加靜態(tài)方法,是把這個(gè)方法添加給類(lèi)。因此也是直接給類(lèi)添加的,并且使用staticmethod這個(gè)裝飾器。示例方法如下:

  1. import types

  2. class Person(object):
  3.     country = 'china'
  4.     def __init__(self,name):
  5.         self.name = name

  6. @staticmethod
  7. def run():
  8.     print('在奔跑')

  9. Person.run = run
  10. Person.run()

 

 

動(dòng)態(tài)刪除屬性和方法:

  1. del 對(duì)象.屬性名
  2. delattr(對(duì)象,"屬性名")

 

 

__slots__限制動(dòng)態(tài)添加屬性或方法

示例代碼如下:

  1. class Person(object):
  2.     __slots__ = ('name','age')
  3.     def __init__(self,name):
  4.         self.name = name

  5. p = Person('zhiliao')
  6. setattr(p,'height',180)

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多