Python——類和對象(一)


一、定義類

在面向對象的程序設計中有兩種重要概念:

  • 類:可以理解為一個種類,一個模型,是一種抽象的東西。
  • 實例、對象:可以理解為一種具體制作或者存在的東西。

定義類的語法格式如下:

class 類名:
    執行語句
    零到多個類變量
    零到多個類方法

例如我們需要制作一只碗,首先需要這個碗的模型就是類,在制作這個碗的過程就叫做實例化,制作出來的碗就是實例、對象;這個碗在中國制作,就是類變量;而這個碗的顏色、材料就是這個類的實例變量,具體請看下面代碼:

class BowlModel:
    make_in = 'China'   # 類變量,不需要實例化就調用
    def __init__(self,colour = 'red',material = 'lron'): # __init__方法一般用來對實例的屬性進行初始化
        # 下面兩個是實例變量
        self.colour = colour
        self.material = material
        print ('顏色:',self.colour,'材料:',self.material)

    # 定義make方法
    def make(self,name):
        print (name,'制作了一只',self.colour,self.material,'碗。')  

關於網上一些說__init__是構造函數,一些說__new__才是真正的構造函數,這里找了一些資料大致解析如下:

老式類中其實並沒有 __new__ 方法,因為 __init__ 就是它的構造方法(函數)。

新式類允許開發者根據他們的意圖來重寫 __new__ 和 __init__ 方法。__new__ (構造函數)單獨地創建一個對象,而 __init__ (初始化函數)負責初始化這個對象。

 

二、使用和創建對象

創建對象時,實際是調用了__new__方法,返回當前對象的一個實例,當實例被創建出來后,會調用__init__方法,對當前對象的實例初始化,沒有返回值。

創建對象例:

# 調用BowlModel的構造方法,返回一個BowlModel對象
# 在創建實例對象時,__ini__執行了一次
# 將BowlModel對象賦值給a變量
a = BowlModel()
'''
這里在執行時,過程可以理解為:
a = object.__new__(BowlModel)
print (a) # 返回當前對象的實例,打印 <__main__.BowlModel object at 0x0000000002E2CCC0>
print (BowlModel.__init__(a)) # 執行了一次__init__方法,打印 顏色: red 材料: lron  返回 None

'''
print (a)   # 打印 <__main__.BowlModel object at 0x0000000002E2CD68>

 

當創建完對象之后,就可以對對象的實例變量進行操作(增、刪、改、查),也可以調用和增加對象的方法。

具體語法如下:

對象.方法(參數)
對象.變量  

對對象的實例變量進行增、刪、改、查如下:

# 訪問對象的變量
print (BowlModel.make_in)
print (a.make_in)

# 訪問a實例,直接為colour實例變量賦值
a.colour = 'green'
print (vars(a)) # 返回當前范圍局部變量的字典,打印 {'colour': 'green', 'material': 'lron'}

# 輸出a的material實例變量
print (a.material)  # 打印 lron

# 為a對象動態增加factory實例變量
a.factory = '陶瓷廠'
print (vars(a)) # 打印 {'colour': 'green', 'material': 'lron', 'factory': '陶瓷廠'}

# 使用del語句,動態刪除a對象的factory實例變量
del a.factory
print (vars(a)) # 打印 {'colour': 'green', 'material': 'lron'}

調用對象的方法例:

# 調用a對象的make方法,因為第一參數是自動綁定的,只需要為第二個參數傳入一個值
a.make('老王')    # 打印 老王 制作了一只 green lron 碗。

為對象動態增加方法,例:

def company(self,company_name):
    print (company_name,'在制作一只',self.colour,self.material,'碗。')

a.cy = company
#print (a.cy('大大陶瓷廠'))
# 報錯 TypeError: company() missing 1 required positional argument: 'company_name'
# 由於Pyhon不會自動將調用者綁定到第一個參數self,故需要手動將調用者綁定到第一個參數
a.cy(a,'大大陶瓷廠')
# 打印 大大陶瓷廠 在制作一只 green lron 碗。

當然也可以利用lambda表達式為a對象動態增加方法,例:

a.use = lambda self,people : print (people,'正在使用一只',self.colour,self.material,'碗。')
# 同樣需要手動將調用者綁定到第一個參數
a.use(a,'大明')
# 打印 大明 正在使用一只 green lron 碗。  

如果想讓a對象動態增加的方法自動綁定第一個參數,可以使用types模塊下的MethodType進行包裝,例:

test = lambda self,tester : print (tester,'正在測試一只',self.colour,self.material,'碗。')

from types import MethodType
# 使用MethodType對test進行包裝,將第一個參數自動綁定為a
a.test = MethodType(test,a)
a.test('小宗')
# 打印 小宗 正在測試一只 green lron 碗。

  


免責聲明!

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



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