在本文中,您將通過示例了解Python中的面向?qū)ο缶幊?OOP)及其基本概念。
Python是一種多范式編程語言。意思是說,它支持不同的編程方法。
解決編程問題的一種流行方法是創(chuàng)建對象。也就是所謂的面向?qū)ο缶幊蹋∣OP)。
一個對象具有兩個特征:
屬性
行為
讓我們舉個示例:
鸚鵡是一個物體,
名稱,年齡,顏色是屬性
唱歌,跳舞都是行為
Python中的OOP概念專注于創(chuàng)建可重用的代碼。此概念也稱為DRY(Don't Repeat Yourself)不要重復(fù)自己。
在Python中,OOP的概念遵循一些基本原則:
繼承 | 使用新類的詳細(xì)信息而不修改現(xiàn)有類的過程。 |
封裝 | 對其他對象隱藏類的私有細(xì)節(jié)。 |
多態(tài) | 對不同的數(shù)據(jù)輸入以不同的方式使用通用操作的概念。 |
類是對象的藍(lán)圖。
我們可以將類看作是帶有標(biāo)簽的鸚鵡的素描。它包含有關(guān)名稱,顏色,大小等的所有詳細(xì)信息。基于這些描述,我們可以研究鸚鵡。在這里,鸚鵡是一個對象。
鸚鵡類的示例可以是:
class Parrot: pass
在這里,我們使用class關(guān)鍵字來定義一個空類Parrot。我們從類中構(gòu)造示例。示例是由特定類創(chuàng)建的特定對象。
對象(示例)是類的示例。定義類時,僅定義對象的描述。因此,沒有分配內(nèi)存或存儲。
鸚鵡類對象的示例可以是:
obj = Parrot()
在這里,obj是Parrot類的對象。
假設(shè)我們有鸚鵡的詳細(xì)信息。下面,我們將展示如何構(gòu)建鸚鵡的類和對象。
class Parrot: # 類屬性 species = "鳥" # 示例屬性 def __init__(self, name, age): self.name = name self.age = age # 示例化Parrot類 blu = Parrot("麻雀", 10) woo = Parrot("鸚鵡", 15) # 訪問類屬性 print("麻雀是 {}".format(blu.__class__.species)) print("鸚鵡也是 {}".format(woo.__class__.species)) # 訪問示例屬性 print("{} 有 {} 歲".format( blu.name, blu.age)) print("{} 有 {} 歲".format( woo.name, woo.age))
當(dāng)我們運(yùn)行程序時,輸出將是:
麻雀是 鳥 鸚鵡也是 鳥 麻雀 有 10 歲 鸚鵡 有 15 歲
在上面的程序中,我們創(chuàng)建一個名為Parrot的類。然后,我們定義屬性。屬性是對象的特征。
然后,我們創(chuàng)建Parrot類的示例。在這里,blu和woo是我們新對象的引用(值)。
然后,我們使用class .species訪問class屬性。類的所有示例的類屬性都是相同的。類似地,我們使用blu.name和blu.age訪問示例屬性。但是,對于類的每個示例,示例屬性都是不同的。
要了解有關(guān)類和對象的更多信息,請轉(zhuǎn)到Python類和對象。
方法是在類主體內(nèi)定義的函數(shù)。它們用于定義對象的行為。
class Parrot: # 示例屬性 def __init__(self, name, age): self.name = name self.age = age # 示例方法 def sing(self, song): return "{} sings {}".format(self.name, song) def dance(self): return "{} is now dancing".format(self.name) # 示例化對象 blu = Parrot("Blu", 10) # 調(diào)用我們的示例方法 print(blu.sing("'Happy'")) print(blu.dance())
當(dāng)我們運(yùn)行程序時,輸出將是:
Blu sings 'Happy' Blu is now dancing
在上面的程序中,我們定義了兩種方法,即sing()和dance()。 這些之所以稱為示例方法,是因?yàn)樗鼈兪窃谑纠龑ο螅碽lu)上調(diào)用的。
繼承是一種創(chuàng)建新類的方法,用于在不修改現(xiàn)有類的細(xì)節(jié)的情況下使用它。新形成的類是一個派生類(或子類)。類似地,現(xiàn)有類是基類(或父類)。
# 基類 class Bird: def __init__(self): print("鳥準(zhǔn)備好了") def whoisThis(self): print("鳥") def swim(self): print("游得更快") # 子類 class Penguin(Bird): def __init__(self): # call super() function super().__init__() print("企鵝準(zhǔn)備好了") def whoisThis(self): print("企鵝") def run(self): print("跑得更快") peggy = Penguin() peggy.whoisThis() peggy.swim() peggy.run()
當(dāng)我們運(yùn)行該程序時,輸出將是:
鳥準(zhǔn)備好了 企鵝準(zhǔn)備好了 企鵝 游得更快 跑得更快
在上面的程序中,我們創(chuàng)建了兩個類,即Bird(父類)和Penguin(子類)。子類繼承父類的功能。我們可以從swim()方法中看到這一點(diǎn)。子類再次修改了父類的行為。我們可以從whoisThis()方法中看到這一點(diǎn)。此外,我們通過創(chuàng)建新run()方法來擴(kuò)展父類的功能。
另外,我們在init()方法之前使用super()函數(shù)。這是因?yàn)槲覀兿M麑nit()方法的內(nèi)容從父類拉到子類中。
在Python中使用OOP,我們可以限制對方法和變量的訪問。這樣可以防止數(shù)據(jù)直接修改(稱為封裝)。在Python中,我們使用下劃線作為前綴來表示私有屬性,即單“ _”或雙“ __”。
class Computer: def __init__(self): self.__maxprice = 900 def sell(self): print("售價: {}".format(self.__maxprice)) def setMaxPrice(self, price): self.__maxprice = price c = Computer() c.sell() # 改變價格 c.__maxprice = 1000 c.sell() # 使用setter函數(shù) c.setMaxPrice(1000) c.sell()
當(dāng)我們運(yùn)行該程序時,輸出將是:
售價: 900 售價: 900 售價: 1000
在上面的程序中,我們定義了Computer類。我們使用__init__()方法存儲計算機(jī)的最高售價。我們試圖修改價格。但是,我們無法更改它,因?yàn)镻ython將__maxprice視為私有屬性。要更改該值,我們使用了setter函數(shù),即setMaxPrice(),它以price為參數(shù)。
多態(tài)性是一種功能(在OOP中),可以將公共接口用于多種形式(數(shù)據(jù)類型)。
假設(shè)我們需要給一個形狀上色,有多個形狀選項(xiàng)(矩形,正方形,圓形)。但是,我們可以使用相同的方法為任何形狀著色。這個概念稱為多態(tài)。
class Parrot: def fly(self): print("鸚鵡會飛") def swim(self): print("鸚鵡不會游泳") class Penguin: def fly(self): print("企鵝不會飛") def swim(self): print("企鵝會游泳") # 通用接口 def flying_test(bird): bird.fly() #示例化對象 blu = Parrot() peggy = Penguin() # 傳遞對象 flying_test(blu) flying_test(peggy)
當(dāng)我們運(yùn)行上面的程序時,輸出將是:
鸚鵡會飛 企鵝不會飛
在上面的程序中,我們定義了兩個類Parrot和Penguin。它們每個都有通用的fly()方法。但是,它們的功能不同。為了允許多態(tài),我們創(chuàng)建了通用接口,即flying_test()可以接受任何對象的函數(shù)。然后,我們在flying_test()函數(shù)中傳遞了blu和peggy對象,它有效地運(yùn)行了。
讓編程變得簡單而有效。
類是可共享的,因此可以重復(fù)使用代碼。
讓編程人員的生產(chǎn)力提高
通過數(shù)據(jù)抽象,數(shù)據(jù)是安全的。