面向對象最重要的概念就是類(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
