Python—類和實例對象


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM