寫一篇Python類的入門文章,在高級編程語言中,明白類的概念和懂得如何運用是必不可少的。文章有點長,3000多字。 Python是面向?qū)ο蟮母呒壘幊陶Z言,在Python里面“一切都是對象”:數(shù)字、字符串、元組、列表、字典、集合等內(nèi)置數(shù)據(jù)類型,以及函數(shù)、方法、類、模塊都是對象。 類的定義class 實現(xiàn)的,下面是最簡單的類的定義的樣子:class ClassName: 語句1 ... 語句n 語句1 可能是內(nèi)部變量(數(shù)據(jù))的定義和賦值語句,也可能是內(nèi)部方法(函數(shù))的定義語句。類內(nèi)部的函數(shù)定義通常具有一種特別形式的參數(shù)列表,這是方法調(diào)用的約定規(guī)范里面指明的。這個特別形式就是第一個參數(shù)必須是self ,后面將詳細介紹。ClassName )。類對象ClassName )支持兩種操作:屬性引用和實例化。obj.name 。類對象被創(chuàng)建時存在于類命名空間內(nèi)的所有名稱都是有效的屬性名稱。下面是一個包含數(shù)據(jù)和方法的簡單的類定義:
YuanRenXue.name YuanRenXue.say_hi ,Yuanrenxue.name 的值。__doc__ 也是一個有效的屬性,對他的引用會返回所屬類的文檔字符串:'A demo of class' 。
yrx 。__init__() 的特殊方法。它是類實例化的初始化方法,跟C++語言中 的構(gòu)造函數(shù)類似。def __init__(self): self.data = None __init__() 方法后,類的實例化操作會自動調(diào)用該方法。__init__() 方法也可以有額外(除self之外)的參數(shù)以實現(xiàn)更靈活的初始化操作。類對象實例化時(“調(diào)用”類對象)傳遞的參數(shù)會被傳遞給__init__() 方法。例如:In [27]: class Point: ...: def __init__(self, x, y): ...: self.x = x ...: self.y = y ...:
In [28]: p = Point(7, 8)
In [29]: p.x, p.y Out[29]: (7, 8) 實例對象p 是聲明創(chuàng)建的Point 的實例,則以下代碼會打印數(shù)值8 :p.times = 1 while p.times < 5: p.times = p.times * 2 print(p.times) del p.times p.times 并沒有在類定義時聲明(數(shù)據(jù)屬性不需要聲明),但在任何時候,我們可以給實例賦值一個新的數(shù)據(jù)屬性(這里是p.times ),并可以隨時刪除實例的數(shù)據(jù)屬性(del p.times )。append(), insert(), sort() 等方法。yrx.say_hi 是有效的方法引用,因為YuanRenXue.say_hi 是一個函數(shù);而yrx.name 不是方法,因為YuanRenXue.name 不是一個函數(shù)。這里要注意,yrx.say_hi 與YuanRenXue.say_hi 并不是一回事,它是一個方法對象,不是函數(shù)對象,通俗講,前者是實例的方法,后者是類的函數(shù)。方法對象yrx.say_hi() Hello World 。但是,調(diào)用一個方法也可以換另外一種形式,把它賦值給一個變量后再調(diào)用。例如:yrx_say = yrx.say_hi yrx_say() yrx.say_hi() 時并沒有帶參數(shù),但say_hi() 函數(shù)定義時指定了一個參數(shù)。實際上,方法的特殊之處就是實例對象會作為函數(shù)的第一個參數(shù)(self)被傳入。調(diào)用yrx.say_hi() 其實就相當于YuanRenXue.say_hi(yrx) 。類變量和實例變量In [33]: class Tiger: ...: kind = 'feline' ...: def __init__(self, name) File '<ipython-input-33-16aa1a5937d1>', line 3 def __init__(self, name) ^ SyntaxError: invalid syntax
In [34]: class Tiger: ...: kind = 'feline' ...: def __init__(self, name): ...: self.name = name ...:
In [35]: a = Tiger('Kiro')
In [36]: b = Tiger('Zim')
In [37]: a.kind Out[37]: 'feline'
In [38]: b.kind Out[38]: 'feline'
In [39]: a.name Out[39]: 'Kiro'
In [40]: b.name Out[40]: 'Zim' In [42]: class Tiger: ...: places = [] ...: def __init__(self, name): ...: self.name = name ...: def go_place(self, place): ...: self.places.append(place) ...:
In [43]: a = Tiger('Kiro')
In [44]: b = Tiger('Zim')
In [45]: a.go_place('北京')
In [46]: b.go_place('上海')
In [47]: a.places Out[47]: ['北京', '上海'] places 定義為類變量,它就記錄了所有老虎(Kiro和Zim,以及后面實例化出來個各個老虎)去過的地方,所以,盡管a 只去過北京,但是當我們通過a 查看places ,也看到了上海。這就是可變對象作為類變量時的特性。如果我們就是想記錄所有老虎實例對象去過的地方,這樣的用法就是恰到好處。places 定義為實例變量,也就是在__init__() 中進行初始化賦值。需要注意的地方
self ,代表實例對象。但這只是大家普通認同的一個約定。你可以用任何單詞來替代它,但是你的代碼讓氣體程序員讀起來就很費勁,也會對VS Code這樣的編輯器造成困惑。總結(jié)
|
|
來自: Four兄 > 《Python筆記》