您好,登錄后才能下訂單哦!
一. Python 的類和實例
在面向?qū)ο笾校钪匾母拍罹褪穷悾╟lass)和實例(instance),類是抽象的模板,而實例是根據(jù)類創(chuàng)建出來的一個個具體的 “對象”。
就好比,學生是個較為抽象的概念,同時擁有很多屬性,可以用一個 Student 類來描述,類中可定義學生的分數(shù)、身高等屬性,但是沒有具體的數(shù)值。而實例是類創(chuàng)建的一個個具體的對象, 每一個對象都從類中繼承有相同的方法,但是屬性值可能不同,如創(chuàng)建一個實例叫 hansry 的學生,其分數(shù)為 93,身高為 176,則這個實例擁有具體的數(shù)值。
1.類:以Student類為例,在Python中,定義類如下:
class Student(object): def __init__(self,name,score): self.name=name self.score=score
a.(object)表示的是該類從哪個類繼承下來的,而object類是每個類都會繼承的一個類。 yt
b. __init__ 方法的第一參數(shù)永遠是 self,用來表示類創(chuàng)建的實例本身,因此,在 __init__ 方法內(nèi)部,就可以把各種屬性綁定到self,因為self 本身就是指向創(chuàng)建的實例本身。
c. 有了 __init__ 方法后,在創(chuàng)建實例的時候,就不能傳入空參數(shù),必須傳入與 __init__ 方法匹配的參數(shù),但self本身不需要傳入?yún)?shù),只需要傳入 self 后面的參數(shù)即可。
2.實例: 定義好了類后,就可以通過Student類創(chuàng)建出 Student 的實例,創(chuàng)建實例是通過 類名 + ()實現(xiàn):
student = Student('name', 93) >>> student.name "name" >>> student.score 93
a. 其中 Student 是類名稱,('name',93)為要傳入的參數(shù)
b. self.name 就是 Student類的屬性變量,為 Student 類所有。同時, name 是外部傳來的參數(shù),不是 Student 類所自帶的。故 self.name = name 的意思就是把外部傳來的參數(shù) name 的值賦值給 Student類自己的屬性變量 self.name .
3.和普通函數(shù)相比,在類中定義函數(shù)只有一點不同,就是第一參數(shù)永遠是類的本身實例變量 self, 并且調(diào)用時,不用傳遞該參數(shù)。 除此之外,類的方法(函數(shù))和普通函數(shù)沒有啥區(qū)別。既可以用 默認參數(shù)、可變參數(shù)或者關鍵字參數(shù)等。
二. 類 以及 實例的訪問
1.限制外部對類實例屬性的訪問
既然 Student 類實例本身就擁有這些屬性的數(shù)據(jù),那么要訪問這些數(shù)據(jù),就沒必要從外面的函數(shù)去訪問,而可以在類的內(nèi)部定義訪問數(shù)據(jù)的函數(shù),這樣,就可以把 ”數(shù)據(jù)“ 封裝起來了。這些封裝數(shù)據(jù)的函數(shù)和 Student 類本身是相關聯(lián)的,稱之為類的方法:
class Student(obiect): def __init__(self, name, score): self.name = name self.score = score def print_score(self): print "%s: %d" % (self.name, self.score)
>>> student= Student("hansry",99) >>> student.print_property() hansry:99
由此可見,從外部看Student類,我們只知道創(chuàng)建實例需要給出 name 和 score。究竟如何打印,是 Student 類內(nèi)部定義的,這些數(shù)據(jù)和邏輯被封裝起來了,調(diào)用也就變得容易了,但是不知道內(nèi)部實現(xiàn)的細節(jié)。
如果不想讓實例中的內(nèi)部屬性被外部屬性訪問,則把 name 和 score 變成 __name 和 __score 即可,如下代碼所示:
class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_property(self): print "%s: %d" %(self.__name,self.__score)
>>> student= Student("hansry",99) >>> student.print_property() >>> student.__name() hansry:99 Traceback (most recent call last): AttributeError: 'Student' object has no attribute '__name'
2.開 API 使得外部代碼能夠訪問到里面的屬性,并且對其進行修改
外部代碼訪問到類實例屬性,代碼如下:
def __init__(self,name,score): self.__name=name self.__score=score def print_property(self): print("%s:%d"%(self.__name,self.__score)) def get_name(self): return self.__name def get_score(self): return self.__score
name=student.get_name() score=student.get_score() print ("%s,%d" % (name,score))
外部代碼修改類里面的實例屬性,代碼如下:
def __init__(self,name,score): self.__name=name self.__score=score def print_property(self): print("%s:%d"%(self.__name,self.__score)) def reset_name(self,change_name): self.__name = change_name def reset_score(self, change_score): self.__score = change_score
student= Student("hansry",99) student.print_property() student.reset_name("simona") student.reset_score(91) name=student.get_name() score=student.get_score() print ("%s:%d" % (name,score)) hansry:99 simona:91
需要注意的是,在Python中,變量名類似 _xxx_的,也就是雙下劃線開頭,并且以下劃線結(jié)尾的,是特殊變量,特殊變量是可以直接訪問的,不是 private 變量,不能用 __name__, __score__ 。
三. self 的仔細用法
1.self代表類的實例,而非類。
class Student(object): def print_self(self): print(self) print(self.__class__)
student=Student() student.print_self() <__main__.Student object at 0x7fd9095aed90> <class '__main__.Student'>
從上面例子可得,self代表的只是類的實例,而 self.__class__ 才是類。
2. 定義類的時候,self最好寫上,因為它代表了類的實例。
3. 在繼承時,傳入的是哪個實例,就是那個傳入的實例,而不是指定義了self的類的實例。
class Teacher(object): def __init__(self,teacher): self.teacher=teacher print(self.teacher) def print_self(self): print(self) class Student(Teacher): def __init__(self,student): self.student=student print(self.student) def print_self_1(self): print(self)
teacher=Teacher("hansry") student=Student("simona") student.print_self_1() student.print_self() hansry simona <__main__.Student object at 0x7fd9095b0950> <__main__.Student object at 0x7fd9095b0950>
在運行 student.print_self() 的時候,這里是調(diào)用了 類 Teacher 的 print_self() 函數(shù),此時雖然調(diào)用的是 類Teacher的函數(shù),但是此時的實例 self 確是 類 Student 實例化時生成的。
以上這篇對Python中class和instance以及self的用法詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。