1017|實(shí)例屬性和類屬性,使用__slots__

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186739713011a09b63dcbd42cc87f907a778b3ac73000

由于Python是動(dòng)態(tài)語言,根據(jù)類創(chuàng)建的實(shí)例可以任意綁定屬性竹握。

給實(shí)例綁定屬性的方法是通過實(shí)例變量,或者通過self變量:

class Student(object):
    def __init__(self, name):
        self.name = name

s = Student('Bob')
s.score = 90

但是,如果Student類本身需要綁定一個(gè)屬性呢克蚂?可以直接在class中定義屬性,這種屬性是類屬性,歸Student類所有:

class Student(object):
    name = 'Student'

當(dāng)我們定義了一個(gè)類屬性后,這個(gè)屬性雖然歸類所有急前,但類的所有實(shí)例都可以訪問到。來測(cè)試一下:

>>> class Student(object):
...     name = 'Student'
...
>>> s = Student() # 創(chuàng)建實(shí)例s
>>> print(s.name) # 打印name屬性瀑构,因?yàn)閷?shí)例并沒有name屬性裆针,所以會(huì)繼續(xù)查找class的name屬性
Student
>>> print(Student.name) # 打印類的name屬性
Student
>>> s.name = 'Michael' # 給實(shí)例綁定name屬性
>>> print(s.name) # 由于實(shí)例屬性優(yōu)先級(jí)比類屬性高,因此寺晌,它會(huì)屏蔽掉類的name屬性
Michael
>>> print(Student.name) # 但是類屬性并未消失世吨,用Student.name仍然可以訪問
Student
>>> del s.name # 如果刪除實(shí)例的name屬性
>>> print(s.name) # 再次調(diào)用s.name,由于實(shí)例的name屬性沒有找到呻征,類的name屬性就顯示出來了
Student

從上面的例子可以看出耘婚,在編寫程序的時(shí)候,千萬不要把實(shí)例屬性和類屬性使用相同的名字陆赋,因?yàn)橄嗤Q的實(shí)例屬性將屏蔽掉類屬性沐祷,但是當(dāng)你刪除實(shí)例屬性后,再使用相同的名稱攒岛,訪問到的將是類屬性赖临。

第一,slots只能限制添加屬性阵子,不能限制通過添加方法來添加屬性:

def set_city(self, city):
self.city=city

class Student(object):
slots = ('name', 'age', 'set_city')
pass

Student.set_city = MethodType(set_city, Student)

a = Student()
a.set_city(Beijing)
a.city
上段代碼中思杯,Student類限制兩個(gè)屬性name 和 age,但可以通過添加方法添加一個(gè)city屬性(甚至可以添加很多屬性挠进,只要set_city方法里有包括)

第二色乾,屬性分實(shí)例屬性和類屬性,多個(gè)實(shí)例同時(shí)更改類屬性领突,值是最后更改的一個(gè)

def set_age(self,age):
self.age=age

class Stu(object):
pass

s=Stu()
a=Stu()

from types import MethodType

Stu.set_age=MethodType(set_age,Stu)

a.set_age(15) \通過set_age方法暖璧,設(shè)置的類屬性age的值
s.set_age(11) \也是設(shè)置類屬性age的值,并把上個(gè)值覆蓋掉
print(s.age,a.age) \由于a和s自身沒有age屬性君旦,所以打印的是類屬性age的值

a.age = 10 \給實(shí)例a添加一個(gè)屬性age并賦值為10
s.age = 20 \給實(shí)例b添加一個(gè)屬性age并賦值為20
\這兩個(gè)分別是實(shí)例a和s自身的屬性澎办,僅僅是與類屬性age同名,并沒有任何關(guān)系

print(s.age,a.age) \打印的是a和s自身的age屬性值金砍,不是類age屬性值
所以局蚀,
1,slots并不能嚴(yán)格限制屬性的添加恕稠,可通過在方法里定義限制之外的屬性來添加本不能添加的屬性(當(dāng)然琅绅,前提是方法沒有被限制)
2,類屬性是公共屬性鹅巍,所有實(shí)例都可以引用的千扶,前提是實(shí)例自身沒有同名的屬性,因此類屬性不能隨意更改(別的實(shí)例可能在引用類屬性的值)骆捧,就是說不能隨便用a.set_age()更改age的值(因?yàn)檎{(diào)用此方法更改的是類屬性age的值澎羞,不是實(shí)例a自身的age屬性值)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敛苇,隨后出現(xiàn)的幾起案子妆绞,更是在濱河造成了極大的恐慌,老刑警劉巖枫攀,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括饶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脓豪,警方通過查閱死者的電腦和手機(jī)巷帝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扫夜,“玉大人楞泼,你說我怎么就攤上這事◇源常” “怎么了堕阔?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)颗味。 經(jīng)常有香客問我超陆,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任时呀,我火速辦了婚禮张漂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谨娜。我一直安慰自己航攒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布趴梢。 她就那樣靜靜地躺著漠畜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坞靶。 梳的紋絲不亂的頭發(fā)上憔狞,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音彰阴,去河邊找鬼瘾敢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硝枉,可吹牛的內(nèi)容都是我干的廉丽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼妻味,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼正压!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起责球,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤焦履,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后雏逾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘉裤,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年栖博,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屑宠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仇让,死狀恐怖典奉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丧叽,我是刑警寧澤卫玖,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站踊淳,受9級(jí)特大地震影響假瞬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一脱茉、第九天 我趴在偏房一處隱蔽的房頂上張望剪芥。 院中可真熱鬧,春花似錦芦劣、人聲如沸粗俱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至签财,卻和暖如春串慰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唱蒸。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工邦鲫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人神汹。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓庆捺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屁魏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滔以,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法氓拼,內(nèi)部類的語法你画,繼承相關(guān)的語法,異常的語法桃漾,線程的語...
    子非魚_t_閱讀 31,643評(píng)論 18 399
  • 20- 枚舉,枚舉原始值,枚舉相關(guān)值,switch提取枚舉關(guān)聯(lián)值 Swift枚舉: Swift中的枚舉比OC中的枚...
    iOS_恒仔閱讀 2,281評(píng)論 1 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理坏匪,服務(wù)發(fā)現(xiàn),斷路器撬统,智...
    卡卡羅2017閱讀 134,665評(píng)論 18 139
  • Swift 介紹 簡(jiǎn)介 Swift 語言由蘋果公司在 2014 年推出适滓,用來撰寫 OS X 和 iOS 應(yīng)用程序 ...
    大L君閱讀 3,225評(píng)論 3 25
  • 新興高端婚慶就是傳統(tǒng)意義上僅注重婚慶典禮的婚慶行業(yè)的延伸與擴(kuò)充。它不僅是一個(gè)涉及行業(yè)面廣的服務(wù)綜合性產(chǎn)業(yè)恋追,而且是一...
    奧格排行閱讀 2,389評(píng)論 0 4