面向對象最重要的概念就是類(Class)和實例(Instance),必須牢記類是抽象的模板,比如Student類,而實例是根據類創建出來的一個個具體的“對象”,每個對象都擁有相同的方法,但各自的數據可能不同。
簡介:所謂的類只是一個抽象的定義,而實例則是具體的對象。它們之間的差別就想我腦海中的石頭和我手中的石頭一樣,只有后者才真實存在。類就是一個模板,每一個類創建好之后,就是一個模板。可以用這個模板生成一個個實例對象。
新舊式類的差別
object
是 Python
為所有對象提供的 基類,提供有一些內置的屬性和方法,可以使用 dir
函數查看。
新式類:以 object 為基類的類,推薦使用。
經典類:不以 object 為基類的類,不推薦使用。
在 Python 3.x 中定義類時,如果沒有指定父類,默認使用 object 作為該類的基類 —— Python 3.x 中定義的類都是 新式類。
在 Python 2.x 中定義類時,如果沒有指定父類,則不會以 object 作為該類的基類。
# -*- coding:utf-8 -*- class NewClass(object): # 可以不寫object,默認就是object pass class OldClass: pass New = NewClass() # 創建一個新式類的實例 Old = OldClass() # 創建一個經典類的實例 print(type(NewClass)) # python3結果:<class 'type'> python2結果:<type 'type'> print(type(New)) # python3結果:<class '__main__.NewClass'> python2結果:<class '__main__.NewClass'> print(type(OldClass)) # python3結果:<class 'type'> python2結果:<type 'classobj'> print(type(Old)) # python3結果:<class '__main__.OldClass'> python2結果:<type 'instance'>
在python2運行結果中,我們可以看見經典類輸出很含糊,經典類屬於類對象,無論是哪個類,都統一為“類”類型,實例屬於實例類型,卻不知道其是由哪個類創建的,所以的實例都統一為“實例”類型。
也就是說當時的類型用 classobj 和 instance 代表了所以的類和實例,無論你是哪個類,又或是哪個類創建的實例。這樣的信息實在太少,而類和類型之間非常混亂。為了解決這種情況,在 python2.2 中引入了新式類,並進行了類和類型的同統一。
創建實例對象
# -*- coding:utf-8 -*- class NewClass(object): def __init__(self, age): self.age = age # 創建方式1 obj1 = NewClass(123) # 通過類名+(),來創建實例對象 print(obj1.age,id(obj1)) # 結果:123 140408922671424 # 創建方式2 obj2 = type(obj1)(321) # 對實例來說type返回的是類對象,又可以用類對象來創建新的實例 print(obj2.age,id(obj2)) # 結果:321 140408922670360
總結的來說:在新式類中,所以的類對象都是 type 的實例。而不同的類對象又能創建出其對應的實例。
創建一個完整的類
class Person: def __init__(self, name, gender): self.__name = name # 私有實例變量(__name)前有2個下划線 self.gender = gender def getName(self): return self.__name if __name__ == "__main__": person=Person("張三", 26) # print(person.__name) print(person.getName())
https://www.liaoxuefeng.com/wiki/1016959663602400/1017496031185408