您好,登錄后才能下訂單哦!
python中的class是什么意思?這個問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
面向?qū)ο蟮脑O(shè)計(jì)思想是從自然界中來的,因?yàn)樵谧匀唤缰?,類(Class)和實(shí)例(Instance)的概念是很自然的。Class是一種抽象概念,比如我們定義的Class——Student,是指學(xué)生這個概念,而實(shí)例(Instance)則是一個個具體的Student,比如,Bart Simpson和Lisa Simpson是兩個具體的Student。
類和實(shí)例
類(Class)和實(shí)例(Instance)是面向?qū)ο笞钪匾母拍睢?/span>
類是指抽象出的模板。實(shí)例則是根據(jù)類創(chuàng)建出來的具體的“對象”,每個對象都擁有從類中繼承的相同的方法,但各自的數(shù)據(jù)可能不同。
在python中定義一個類:
class Student(object): pass
關(guān)鍵字class后面跟著類名,類名通常是大寫字母開頭的單詞,緊接著是(object),表示該類是從哪個類繼承下來的。通常,如果沒有合適的繼承類,就使用object類,這是所有類最終都會繼承下來的類。
定義好了 類,就可以根據(jù)Student類創(chuàng)建實(shí)例:
>>> class Student(object): ... pass ... >>> bart = Student() # bart是Student()的實(shí)例 >>> bart <__main__.Student object at 0x101be77f0> >>> Student # Student 本身是一個類 <class '__main__.Student'>
可以自由地給一個實(shí)例變量綁定屬性,比如,給實(shí)例bart綁定一個name屬性:
>>> bart.name = "diggzhang" >>> bart.name'diggzhang'
類同時也可以起到模板的作用,我們可以在創(chuàng)建一個類的時候,把一些認(rèn)為公共的東西寫進(jìn)類定義中去,在python中通過一個特殊的__init__方法實(shí)現(xiàn):
class Student(object): """__init__ sample.""" def __init__(self, name, score): self.name = name self.score = score
__init__方法的第一個參數(shù)永遠(yuǎn)都是self,表示創(chuàng)建實(shí)例本身,在__init__方法內(nèi)部,可以把各種屬性綁定到self,因?yàn)閟elf指向創(chuàng)建的實(shí)例本身。
有了__init__方法,在創(chuàng)建實(shí)例的時候,就不能傳入空的參數(shù)了,必須傳入與__init__方法匹配的參數(shù),但self不需要傳,Python解釋器自己會把實(shí)例變量傳進(jìn)去。如下面的類,在新建實(shí)例的時候,需要把name和score屬性捆綁上去:
class Student(object): """example for __init__ function passin args.""" def __init__(self, name, score): self.name = name self.score = score
我們直接看個實(shí)例,如果我們老老實(shí)實(shí)傳name和score進(jìn)去的時候,成功聲明了這個實(shí)例,但是只傳一個值的時候,報錯:
In [1]: class Student(object): ...: def __init__(self, name, score): ...: self.name = name ...: self.score = score ...: In [2]: bart = Student('diggzhang', 99) In [3]: bart.name Out[3]: 'diggzhang' In [4]: bart.score Out[4]: 99 In [5]: bart_test = Student('max') --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-6-97f4e2f67951> in <module>() ----> 1 bart_test = Student('max') TypeError: __init__() takes exactly 3 arguments (2 given)
和普通函數(shù)相比,在類中定義的函數(shù)只有一點(diǎn)不同,就是第一個參數(shù)永遠(yuǎn)是實(shí)例變量self,并且,調(diào)用時,不用傳遞該參數(shù)。除此之外,類的方法和普通函數(shù)沒有什么區(qū)別。
面向?qū)ο缶幊痰囊粋€重要特點(diǎn)就是數(shù)據(jù)封裝。在上面的Student類中,每個實(shí)例就擁有各自的name和score這些數(shù)據(jù)。我們可以通過函數(shù)來訪問這些數(shù)據(jù),比如打印一個學(xué)生的成績:
def print_socre(std): print("%s: %s" % (std.name, std.score)) print_socre(bart) # 實(shí)際執(zhí)行效果 In [7]: def print_socre(std): ...: print("%s: %s" % (std.name, std.score)) ...: In [8]: print_socre(bart) diggzhang: 99
既然我們創(chuàng)建的實(shí)例里有自身的數(shù)據(jù),如果想訪問這些數(shù)據(jù),就沒必要從外面的函數(shù)去訪問,可以在Student類內(nèi)部去定義這樣一個訪問數(shù)據(jù)的函數(shù),這樣就把“數(shù)據(jù)”給封裝起來了。這些封裝數(shù)據(jù)的函數(shù)和Student類本身關(guān)聯(lián)起來的,我們稱之為類的方法:
class Student(object): def __init__(self, name, score): self.name = name self.score = score def print_socre(self): print("%s: %s" % (self.name, self.score))
要定義一個類的方法,除了傳入的第一個參數(shù)是self外,其它和普通函數(shù)一樣。如果想調(diào)用這個方法,直接在實(shí)例變量上調(diào)用,除了self不用傳遞,其余參數(shù)正常傳入:
>>> bart.print_score()Bart Simpson: 59
實(shí)際代碼,需要在Python3環(huán)境中測試,Python2.7會報錯(NameError: global name 'name' is not defined)
$ python3 Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> class Student(object): ... def __init__(self, name, score): ... self.name = name ... self.score = score ... def print_score(self): ... print("%s: %s" % (self.name, self.score)) ... >>> bart = Student('zhang', 99) >>> bart.print_score() zhang: 99 >>>
數(shù)據(jù)和邏輯都被封裝起來,直接調(diào)用方法即可,但卻可以不用知道內(nèi)部的細(xì)節(jié)。
類,是創(chuàng)建實(shí)例的模板,而 實(shí)例 則是一個一個具體的對象,各個實(shí)例擁有的數(shù)據(jù)都互相獨(dú)立,互不影響;
方法 就是與實(shí)例綁定的函數(shù),和普通函數(shù)不同,方法可以直接訪問實(shí)例的數(shù)據(jù);
通過在實(shí)例上調(diào)用方法,我們就直接操作了對象內(nèi)部的數(shù)據(jù),但無需知道方法內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。
感謝各位的閱讀!看完上述內(nèi)容,你們對python中的class是什么意思大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。