概述
成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司10多年經(jīng)驗(yàn)成就非凡,專(zhuān)業(yè)從事成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)頁(yè)制作,軟文發(fā)布平臺(tái),一元廣告等。10多年來(lái)已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:18982081108,我們期待您的來(lái)電!面向?qū)ο缶幊蹋∣bject Oriented Programming,即 OOP),是一種程序設(shè)計(jì)思想,比面向過(guò)程編程更加靈活,更易擴(kuò)展。
Python 在設(shè)計(jì)的時(shí)候就是按照面向?qū)ο缶幊痰乃枷朐O(shè)計(jì)的,像我們前面學(xué)過(guò)的各種數(shù)據(jù)類(lèi)型,如字符串、列表、字典等都是一個(gè)個(gè)對(duì)象,它們都具有各自的屬性和行為。
面向?qū)ο缶幊叹褪菍⒖陀^存在的事物,總結(jié)提煉出它們各自的屬性與行為,然后通過(guò)編程的方法形成一個(gè)模版(即類(lèi)),我們就可以根據(jù)這個(gè)模版創(chuàng)建出一個(gè)個(gè)實(shí)際的、可使用的對(duì)象(即類(lèi)的實(shí)例)。
特性
封裝
封裝是面向?qū)ο缶幊痰暮诵乃枷耄磳?duì)象具有的,且是我們需要的屬性和行為封裝起來(lái),編寫(xiě)成一個(gè)模版(即類(lèi)),而在使用的時(shí)候只需要事先根據(jù)定義好的模版創(chuàng)建出其實(shí)例即可,使用過(guò)程中無(wú)需知道其屬性和行為是如何實(shí)現(xiàn)的,只需要知道它們能夠完成哪些功能即可。
繼承
舉個(gè)例子,我們創(chuàng)建一個(gè)四邊形的類(lèi),它具有四條邊,四個(gè)角這兩個(gè)特性,計(jì)算周長(zhǎng)、面積這兩個(gè)行為;當(dāng)我們基于這個(gè)四邊形的類(lèi),再創(chuàng)建一個(gè)平行四邊形的類(lèi),則該平行四邊形也將自動(dòng)具有四條邊、四個(gè)角的特性和計(jì)算周長(zhǎng)、面積的行為。
繼承就是實(shí)現(xiàn)重復(fù)利用的重要手段,子類(lèi)可以繼承父類(lèi)的屬性和行為。
多態(tài)
子類(lèi)繼承于父類(lèi),那么子類(lèi)也就擁有了父類(lèi)的特性和行為,但是因?yàn)樽宇?lèi)相對(duì)于父類(lèi)而言是一個(gè)全新的類(lèi),所以它也擁有自己獨(dú)特的特性和行為,這就是多態(tài)。例如,平行四邊形繼承于四邊形,同樣擁有四條邊和四個(gè)角同時(shí),它也有自己的特性,如對(duì)邊相等,對(duì)角相等。
類(lèi)和實(shí)例
面向?qū)ο缶幊痰乃枷刖褪怯么a描述客觀世界中的物體,但是不可能將每個(gè)物體都用代碼描述一遍,這不現(xiàn)實(shí),所以引入了類(lèi)。類(lèi)就是一系列具有相同特性和行為的物體的集合,描述物體的模版。當(dāng)我們需要一個(gè)該物體的具體實(shí)例時(shí),只需要按照這個(gè)模版就能創(chuàng)建一個(gè)新的物體實(shí)例,然后對(duì)其進(jìn)行操作。
如何定義類(lèi)
在 Python 編程中,使用關(guān)鍵字 class 定義類(lèi),
class Triangle:
pass
Triangle(三角形)是類(lèi)的名字。
創(chuàng)建類(lèi)的實(shí)例
定義好一個(gè)類(lèi),并不能供我們直接使用,而是需要?jiǎng)?chuàng)建一個(gè)它的實(shí)例之后,才可以使用其內(nèi)部的屬性和行為。
就像國(guó)家發(fā)行鈔票,會(huì)制作的一個(gè)鈔票模版,然后根據(jù)這個(gè)模版印刷出一張張的紙幣,這些紙幣就是該鈔票模版的實(shí)例,市場(chǎng)上流通的也是這些紙幣,不會(huì)是這個(gè)鈔票模版。所以,當(dāng)我們要使用這個(gè)類(lèi)的時(shí)候,就需要將其實(shí)例化,創(chuàng)建一個(gè)它的實(shí)例,
class Triangle:
pass
if name == "main":
triangle = Triangle()
triangle 就是類(lèi) Triangle的實(shí)例,也是這個(gè)實(shí)例的名稱(chēng)。
init() 方法
在 Python 中,如果在定義一個(gè)類(lèi)的時(shí)候,不自定義該方法,則編譯器會(huì)自動(dòng)幫我們指定一個(gè)。但是如果想在創(chuàng)建類(lèi)的實(shí)例的時(shí)候,為它的屬性賦予一些參數(shù),就需要自定義一個(gè) init() 方法。
該方法用于在創(chuàng)建類(lèi)的實(shí)例時(shí),傳入必要的屬性。它的第一個(gè)參數(shù)必須是 self ,代表實(shí)例本身,
class Triangle:
def init(self, base, height)
self.base = base
self.height = height
if name == "main":
triangle = Triangle(4, 5)
這樣就給 Triangle 這個(gè)類(lèi)定義了一個(gè) init() 方法,在創(chuàng)建其實(shí)例的時(shí)候,必須傳入除 self 以外的所有參數(shù)。
屬性
屬性指類(lèi)中的變量,包括類(lèi)的屬性和實(shí)例屬性,它們定義的位置不同。
類(lèi)的屬性
類(lèi)的屬性定義在類(lèi)中(實(shí)例方法之外),所有類(lèi)的實(shí)例都可以訪問(wèn)類(lèi)的屬性。
class Triangle:
triangle_amount = 0
def __init__(self, base, height):
self.base = base
self.height = height
Triangle.triangle_amount += 1
if name == "main":
triangle_1 = Triangle(4, 5)
triangle_2 = Triangle(12, 5)
print(Triangle.triangle_amount)
print(triangle_1.triangle_amount)
類(lèi)的屬性可以通過(guò)類(lèi)名直接訪問(wèn),也可以通過(guò)類(lèi)的實(shí)例訪問(wèn)。
類(lèi)的屬性不僅僅只能在定義類(lèi)的時(shí)候定義,也可以在類(lèi)的定義之外動(dòng)態(tài)添加,
class Triangle:
triangle_amount = 0
def __init__(self, base, height):
self.base = base
self.height = height
Triangle.triangle_amount += 1
if name == "main":
triangle_1 = Triangle(4, 5)
triangle_2 = Triangle(12, 5)
Triangle.triangle_number = "001"
print(triangle_1.triangle_number)
print(triangle_2.triangle_number)
實(shí)例屬性
實(shí)例屬性是指在類(lèi)的方法中定義的屬性(變量),只能被類(lèi)的實(shí)例使用。而且,改變一個(gè)實(shí)例的屬性并不會(huì)影響其他實(shí)例,
class Triangle:
def init(self, base, height):
self.base = base
self.height = height
def print_base(self):
print(self.base)
def print_height(self):
print(self.height)
if name == "main":
triangle_1 = Triangle(12, 5)
triangle_2 = Triangle(19, 7)
triangle_1.print_base()
triangle_1.print_height()
triangle_1.base = 20
triangle_1.height = 10
triangle_1.print_base()
triangle_1.print_height()
triangle_2.print_base()
triangle_2.print_height()
在 init() 方法中,base 和 height 就是實(shí)例屬性,當(dāng)創(chuàng)建 triangle_1 和 triangle_2 兩個(gè)三角形的時(shí)候分別給它們的 base 和 height 屬性賦了值。當(dāng)改變 triangle_1 的屬性后,并沒(méi)有影響 triangle_2 的屬性值。
方法
每個(gè)對(duì)象都有其獨(dú)有的行為,在面向?qū)ο缶幊讨邪堰@些行為稱(chēng)為方法,也就是面向過(guò)程編程中的函數(shù),但是有些微差別。
方法需要在定義類(lèi)的時(shí)候一起定義,這樣類(lèi)的實(shí)例就可以使用這些方法。定義方法和定義函數(shù)相似,不過(guò)方法必須包含一個(gè) self 參數(shù),且必須放在第一位,
class Triangle:
def init(self, base, height):
self.base = base
self.height = height
def compute_area(self)
area = self.base * self.height / 2
函數(shù)用于實(shí)現(xiàn)某個(gè)獨(dú)立的功能,而實(shí)例方法是實(shí)現(xiàn)類(lèi)(類(lèi)的實(shí)例)的一個(gè)特性行為,只有類(lèi)的實(shí)例可以使用它。
訪問(wèn)限制
可以在類(lèi)的外部訪問(wèn)創(chuàng)建類(lèi)的時(shí)候定義的屬性和方法,如果我們不想某些屬性或方法在類(lèi)的外部被直接訪問(wèn)(使用),可以給它們加上限制。不受限制的代碼如下:
class Triangle:
description = "我是這個(gè)類(lèi)最原始的描述"
def __init__(self):
pass
def print_base_height(self):
print("我是這個(gè)三角形的底和高")
if name == "main":
print(Triangle.description)
triangle = Triangle()
triangle.print_base_height()
受保護(hù)的
以單下劃線開(kāi)頭的屬性和方法是受保護(hù)的(protected)
class Triangle:
_description = "我是這個(gè)類(lèi)最原始的描述"
_number = 0
def __init__(self):
self._base = "我是底"
print(self._base)
pass
def _print_base_height(self):
print("我是這個(gè)三角形的底和高")
if name == "main":
print(Triangle._description)
triangle = Triangle()
triangle._print_base_height()
print(triangle._base)
print(str(Triangle._number))
Triangle._number += 99
print(str(Triangle._number))
私有的
以雙下劃線開(kāi)頭的屬性和方法是私有的(private),
class Triangle:
description = "我是這個(gè)類(lèi)最原始的描述"
number = 0
def __init__(self):
self.__base = "我是底"
print(self.__base)
pass
def __print_base_height(self):
print("我是這個(gè)三角形的底和高")
def modify_description(self):
print(Triangle.__description)
Triangle.__description = "我是在類(lèi)定義之內(nèi)修改的描述"
print(Triangle.__description)
if name == "main":
triangle = Triangle()
triangle.modify_description()
print(triangle._Triangle__description)
triangle._Triangle__print_base_height()
print(str(triangle._Triangle__number))
triangle._Triangle__number += 99
print(str(triangle._Triangle__number))
通過(guò)上面的代碼可以看出,通過(guò) 類(lèi)的實(shí)例名._類(lèi)名__xxx 的方式依然可以訪問(wèn)私有的屬性和方法。
所以,在 Python 編程中,訪問(wèn)限制并不能真正的限制你,總是可以通過(guò)別的某種方法突破限制,全憑自覺(jué)吧。
@property
通過(guò) @property(裝飾器)可以將一個(gè)方法轉(zhuǎn)換為一個(gè)用于計(jì)算的特殊屬性,可以通過(guò)方法名(無(wú)需在方法名后面加上小括號(hào))直接訪問(wèn)該方法,
class Triangle:
def init(self, base, height):
self.base = base
self.height = height
@property
def compute_area(self):
return self.base * self.height / 2
if name == "main":
triangle = Triangle(12, 5)
print(triangle.compute_area)
繼承
繼承是面向?qū)ο缶幊痰囊粋€(gè)重要特性,被繼承的類(lèi)稱(chēng)為父類(lèi)(或基類(lèi)),繼承父類(lèi)的類(lèi)稱(chēng)為子類(lèi)(或派生類(lèi)),子類(lèi)具有父類(lèi)除了私有屬性和方法以外的所有屬性和方法。繼承使得子類(lèi)不再需要重新定義父類(lèi)中已有的屬性和方法,只要拿過(guò)來(lái)直接用就可以了。
class Triangle:
def init(self, base, height):
self.base = base
self.height = height
@property
def compute_area(self):
return self.base * self.height / 2
class IsoscelesTriangle(Triangle):
pass
if name == "main":
isosceless_triangle = IsoscelesTriangle(12, 5)
print(isosceless_triangle.compute_area)
多態(tài)
如果是僅僅只能繼承父類(lèi)的一切,那和父類(lèi)還有什么兩樣?所以,子類(lèi)除了可以繼承父類(lèi),還可以根據(jù)自己的特點(diǎn)增加自己的特性,修改從父類(lèi)集成的特性,也就是面向?qū)ο缶幊痰亩鄳B(tài)。
class Rectangle:
def init(self, length, width):
self.length = length
self.width = width
@property
def area(self):
return self.length * self.width
@property
def perimeter(self):
return (self.length + self.width) * 2
class Square(Rectangle):
def init(self, length, width=0):
self.length = length
self.width = width
@property
def area(self):
return self.length ** 2
@property
def perimeter(self):
return self.length * 4
if name == "main":
rectangle = Rectangle(12, 5)
print(str(rectangle.area))
print(str(rectangle.perimeter))
square = Square(12)
print(str(square.area))
print(str(square.perimeter))
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。