非常詳細的講解(爆肝1w字)????????????
零基礎(chǔ)一樣學(xué)得會??????
干貨滿滿不看后悔??????
??個人主頁→數(shù)據(jù)挖掘博主ZTLJQ的主頁
?
個人推薦python學(xué)習(xí)系列:
??爬蟲JS逆向系列專欄?-?爬蟲逆向教學(xué)
??python系列專欄?-?從零開始學(xué)python
目錄
面向?qū)ο蟮母拍詈驮?/p>
??1、什么是面向?qū)ο缶幊蹋?/p>
??2、面向?qū)ο蟮奶卣骱蛢?yōu)點
??3、類與對象的關(guān)系和定義
類與對象的關(guān)系
類和對象的定義
??4、封裝、繼承和多態(tài)的概念和應(yīng)用
Python中的面向?qū)ο缶幊袒A(chǔ)
???1、創(chuàng)建類和對象
???2、初始化方法和實例屬性
???3、類方法和靜態(tài)方法的應(yīng)用
一、類方法
二、靜態(tài)方法
三、類方法和靜態(tài)方法的應(yīng)用
??4、繼承和子類化
??5、多重繼承
面向?qū)ο蟮母拍詈驮?/h2>
??1、什么是面向?qū)ο缶幊蹋?/h3>
面向?qū)ο缶幊蹋∣bject-Oriented Programming,OOP)是一種常用的編程思想,它強調(diào)萬物皆對象,因此在編程時我們可以將現(xiàn)實世界中的事物抽象成程序中的對象,從而更好實現(xiàn)軟件的設(shè)計與開發(fā)。與傳統(tǒng)的基于函數(shù)的編程不同,面向?qū)ο缶幊套⒅赜趯?shù)據(jù)與行為封裝在一起,即對象既包含數(shù)據(jù)狀態(tài),還包含可調(diào)用的行為方法。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-594479.html
面向?qū)ο缶幊痰奶攸c在于,它具有封裝、繼承和多態(tài)三大特性。封裝意味著將對象的狀態(tài)和行為進行封裝,使其對外只暴露必要的接口,從而提高了安全性和可維護性;繼承指的是某個對象可以繼承另一個對象的特性,從而快速構(gòu)建具有相似屬性的對象;多態(tài)是指同一種行為在不同的對象上具有不同的表現(xiàn)形式,即在不同的情境下,同一個方法可以被不同的對象進行調(diào)用。
?
總之,面向?qū)ο缶幊淌且环N強大的編程方式,它具有高度封裝性、靈活的繼承性和強大的多態(tài)性,通過使用對象作為程序的基本處理單元,實現(xiàn)了數(shù)據(jù)和行為的有機結(jié)合,可以使程序更加高效、結(jié)構(gòu)清晰,并方便管理和擴展。
??2、面向?qū)ο蟮奶卣骱蛢?yōu)點
首先要講的是封裝,封裝是OOP中最基本的特征之一,它將數(shù)據(jù)和方法封裝在一個單獨的單元中。對于實現(xiàn)封裝,可以使用類來描述一個對象,類包括數(shù)據(jù)成員和成員函數(shù)。在類的定義中,可以使用關(guān)鍵字public、protected和private來指定成員訪問權(quán)限,以保護數(shù)據(jù)的安全性。
?
代碼示例:
class Student:
def __init__(self, name, age):
# 公共成員變量
self.name = name
# 私有成員變量
self.__age = age
def info(self):
print('姓名:' + self.name)
print('年齡:' + str(self.__age))
# Student類包括了兩個成員變量(name和age)和一個成員函數(shù)(info())。
# 其中,name是公共成員變量,可以被外部訪問;而age被定義成私有成員變量,只能在類內(nèi)部訪問。
# 通過封裝,可以保證數(shù)據(jù)不被外部隨意修改,保證代碼的安全性。
其次要講的就是封裝,繼承可以讓子類繼承父類的屬性和方法,并且在基礎(chǔ)上進行擴展。繼承是代碼復(fù)用的一種重要方式,它可以減少代碼冗余,增加程序的可維護性。
?
代碼示例:
class Animal:
def __init__(self, name):
# 私有成員變量
self.__name = name
def eat(self):
print(self.__name + '開始偷吃零食')
class Cat(Animal):
def __init__(self, name):
# 調(diào)用父類的構(gòu)造函數(shù)
super().__init__(name)
def run(self):
print(self._name + '開始逃跑')
# Animal類是一個基類,Cat類繼承了Animal類的屬性和方法,并且增加了一個新的方法scratch()。
# 通過繼承,在Cat類中可以調(diào)用Animal類的成員函數(shù)eat()。
最后要講的就是,多態(tài)指的是同一個行為在不同情況下有不同的表現(xiàn)形式。在OOP中,多態(tài)是一種通過繼承、重寫和接口實現(xiàn)的機制,它可以讓不同類的對象對同一消息做出不同的響應(yīng)。
?
代碼示例:
class Animal:
def __init__(self, name):
# 私有成員變量
self.__name = name
def make_sound(self):
# 抽象方法
pass
class Cat(Animal):
def __init__(self, name):
# 調(diào)用父類的構(gòu)造函數(shù)
super().__init__(name)
def make_sound(self):
print(self.__name + '貓叫')
class Dog(Animal):
def __init__(self, name):
# 調(diào)用父類的構(gòu)造函數(shù)
super().__init__(name)
def make_sound(self):
print(self.__name + '狗叫')
# Animal類包含一個抽象方法make_sound(),它在子類中被重寫,實現(xiàn)了多態(tài)。
# Cat類和Dog類都是Animal類的子類,它們重寫了make_sound()方法
# 使得同一個行為(make_sound())在不同情況下有不同的表現(xiàn)形式。
??3、類與對象的關(guān)系和定義
類與對象的關(guān)系我們可以用一個案例類比,假設(shè)你要買一張飛機票,并且你需要填寫一份訂票表格。這份訂票表格就相當(dāng)于一個類,它有一些屬性(如你的姓名、航班編號、起點和終點等信息),而你填寫的表格就是對象。在填寫表格時,你需要根據(jù)表格的屬性來輸入相關(guān)信息,就像在使用類時需要調(diào)用類的屬性和方法一樣。
類與對象的關(guān)系
類是一個模板,對象是根據(jù)這個模板創(chuàng)建的具體實例。如果將類比喻為蛋糕模具,那么對象就是蛋糕。一個類可以創(chuàng)建多個對象,它們之間是獨立的,互相不影響。
類和對象的定義
類是一種用戶自定義的數(shù)據(jù)類型,它由數(shù)據(jù)和方法組成。數(shù)據(jù)表示屬性,方法表示行為。一個類可以包含多個屬性和方法。屬性是類的成員變量,可以存儲數(shù)據(jù)。方法是一組操作數(shù)據(jù)的代碼,它們可以實現(xiàn)某些功能或者改變屬性的值。
給大家展示一個通用的格式:
class 類名:
類屬性 = 值
def __init__(self, 參數(shù)):
self.屬性1 = 參數(shù)1
self.屬性2 = 參數(shù)2
def 方法1(self, 參數(shù)):
# 方法代碼
def 方法2(self, 參數(shù)):
# 方法代碼
-
class
是聲明類的關(guān)鍵字。
-
__init__
是類的構(gòu)造方法,當(dāng)創(chuàng)建類的對象時,會自動調(diào)用這個方法。self
表示對象本身,其他參數(shù)就是對象的屬性。
- 屬性是類的成員變量,可以在類內(nèi)部和外部使用??梢栽陬愅馐褂妙惷L問類屬性,如:
類名.類屬性
。
- 方法是類的成員函數(shù),接受的第一個參數(shù)是
self
,表示對象本身。在類內(nèi)使用方法時,不需要傳遞這個參數(shù)。外部訪問方法時,需要在對象后面加上方法名,如:對象.方法名()
。
舉一個簡單的例子 :
class Dog:
# 類屬性
species = '犬科'
# 構(gòu)造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 方法
def bark(self):
print("汪汪汪")
# 創(chuàng)建對象
dog1 = Dog('大黃', 2)
dog2 = Dog('二黃', 1)
# 訪問屬性
print(dog1.name)
print(dog2.age)
# 調(diào)用方法
dog1.bark()
??4、封裝、繼承和多態(tài)的概念和應(yīng)用
首先介紹封裝的概念,封裝是指將數(shù)據(jù)和行為打包到一個類中,并可以控制外部訪問的級別。封裝可以保護數(shù)據(jù)和方法的訪問,并且提高代碼的可維護性。我們可以利用訪問控制修飾符來實現(xiàn)封裝,包括公有、私有、受保護和包訪問等四種級別。
簡單的來說其實就是,?封裝就是不讓人靠近自己的東西,保護自己的隱私
?
代碼示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
return self.name
def get_age(self):
return self.age
def set_name(self, name):
self.name = name
def set_age(self, age):
self.age = age
person = Person("ZT", 20)
person.set_name("Tim")
print(person.get_name()) # 輸出 Tim
接下來就是繼承,繼承是指一個類可以從父類中繼承方法和屬性。如果父類的某個屬性或方法也在子類中定義了,那么子類會重寫父類的屬性或方法,這樣子類可以更好地針對自己的特定要求來實現(xiàn)相應(yīng)的功能。有人說繼承可以使代碼更加簡潔,但是過度的繼承反而會使代碼變得非常復(fù)雜。---- 繼承其實就像是血緣關(guān)系,你可以從你的祖先那里繼承一些好的特點,但也不能完全成為他們。
?
代碼示例:
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
print(self.name + '在吃東西')
class Dog(Animal):
def __init__(self, name):
super().__init__(name)
def bark(self):
print(self.name + '在汪汪叫')
dog = Dog('小狗')
dog.eat()
dog.bark()
多態(tài)是指對象可以用多種形態(tài)來引用。這樣做可以使代碼更加靈活,因為同樣的操作可以應(yīng)用于不同的類型。多態(tài)有兩種實現(xiàn)方式,一種是基于繼承的實現(xiàn),在這種實現(xiàn)中,父類定義一些通用的方法,子類則可以重寫這些方法并實現(xiàn)不同的功能。另一種實現(xiàn)方式是接口,這種實現(xiàn)方式可以讓不同的類實現(xiàn)同一個接口,從而實現(xiàn)多態(tài)。
?
代碼示例:
class Animal:
def move(self):
pass
class Dog(Animal):
def move(self):
print("狗在跑")
class Cat(Animal):
def move(self):
print("貓在爬")
class Zoo:
def __init__(self):
self.animals = []
def addAnimal(self, animal):
self.animals.append(animal)
def moveAll(self):
for animal in self.animals:
animal.move()
zoo = Zoo()
zoo.addAnimal(Dog())
zoo.addAnimal(Cat())
zoo.moveAll()
# 我們創(chuàng)建了一個動物園Zoo,并在其中添加了一只狗和一只貓。
# 當(dāng)我們調(diào)用moveAll()方法時,它們會分別按照自己的方式移動,即狗會跑,貓會爬。
給大家寫一個綜合了封裝,多態(tài),繼承的案例代碼:
class Animal:
def __init__(self, name, age, gender):
self.__name = name
self.__age = age
self.__gender = gender
def __get_name(self):
return self.__name
def __get_age(self):
return self.__age
def __get_gender(self):
return self.__gender
def eat(self):
print('吃飯中...')
def sleep(self):
print('睡覺中...')
class Dog(Animal):
def __init__(self, name, age, gender, breed):
super().__init__(name, age, gender)
self.__breed = breed
def bark(self):
print('汪汪!')
def play(self):
print('玩球中...')
class Cat(Animal):
def __init__(self, name, age, gender, color):
super().__init__(name, age, gender)
self.__color = color
def meow(self):
print('喵喵!')
def sleep(self):
print('打盹中...')
def animal_action(animal):
animal.eat()
animal.sleep()
if __name__ == '__main__':
dog = Dog('小黃', 3, '雄性', '金毛')
cat = Cat('小花', 2, '雌性', '橘黃色')
animal_action(dog)
animal_action(cat)
Python中的面向?qū)ο缶幊袒A(chǔ)
???1、創(chuàng)建類和對象
首先,類是我們在面向?qū)ο缶幊讨械幕A(chǔ),它是一種用來描述具有相同屬性和方法的對象集合的藍圖。舉個例子,我們可以創(chuàng)建一個名為 "人" 的類,這個類里面包含了姓名、年齡、性別等屬性,以及 eat、sleep、work 等方法。然后我們可以實例化這個 "人" 類,創(chuàng)建很多具有不同屬性的人的對象。
?
代碼示例:
# 首先,我們來創(chuàng)建一個“人”類
class Person:
# 把屬性放在 __init__ 方法里面,注意第一個參數(shù)永遠是 self,代表該類的實例
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
# 這里是一個日常生活中的行為,寫成方法
def eat(self):
print("{} 在吃飯".format(self.name))
# 再來一個睡覺
def sleep(self):
print("{} 正在睡覺".format(self.name))
# 最后一個工作
def work(self):
print("{} 在工作".format(self.name))
# 現(xiàn)在我們創(chuàng)建兩個人的對象
p1 = Person("小明", 18, "男")
p2 = Person("小紅", 22, "女")
# 通過對象調(diào)用方法
p1.eat() # 小明 在吃飯
p2.sleep() # 小紅 正在睡覺
我們創(chuàng)建了一個名為 "Person" 的類,并定義了 "name"、 "age"、 "gender" 等屬性,然后定義了 "eat"、 "sleep"、 "work" 等方法。通過實例化這個類,我們可以創(chuàng)建不同名字、不同年齡、不同性別的人,來調(diào)用這些方法。
???2、初始化方法和實例屬性
初始化方法是在創(chuàng)建一個新的對象實例時,執(zhí)行其中的代碼,以初始化對象的屬性和狀態(tài)。Python 中的初始化方法通常為 init(),它是所有類中的可選方法。當(dāng)您創(chuàng)建一個類的新實例時,Python 將自動調(diào)用 init() 方法,并將該實例作為第一個參數(shù)傳遞給它,并使用該實例來設(shè)置各種屬性和狀態(tài)。
?
代碼示例:
首先,我們定義了一個名為 Person 的類,并在其中編寫了初始化方法 init():
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
在上面的代碼中,我們定義了一個新的類 Person,并在其中定義了初始化方法 init()。此方法將 name 和 age 作為參數(shù)傳遞,并使用 self.name 和 self.age 對象屬性分別賦值。
接下來創(chuàng)建一個 Person 實例,并訪問其中的屬性:
person1 = Person("小明", 20)
print("這個人的名字是:", person1.name)
print("這個人的年齡是:", person1.age)
# 輸出結(jié)果是:
# 這個人的名字是:小明
# 這個人的年齡是:20
在 Python 中,實例屬性是方法內(nèi)部定義的屬性,它們與類的實例相關(guān)聯(lián),并且每個實例都有自己的一套實例屬性。
代碼示例:
我定義了一個名為 Car 的類,并為每個實例定義了一組屬性:
class Car:
def __init__(self):
self.color = "黑色"
self.brand = "奧迪"
self.year = 2023
def describe(self):
print("這輛車是一輛 %d 年的 %s %s ,顏色為 %s" % (self.year, self.brand, self.model, self.color))
car1 = Car()
car1.model = "Q7" # 為對象手動添加一個屬性
car1.describe()
# 輸出結(jié)果是:
# 這輛車是一輛 2023 年的 奧迪 Q7 ,顏色為 黑色
在上面的代碼中,我們定義了一個新的類 Car,并在其中編寫了初始化方法 init()。該方法設(shè)置了一個名為 color、brand 和 year 的實例屬性。同時,該類還定義了一個名為 describe() 的方法,該方法將輸出具體的汽車屬性。
當(dāng)我們創(chuàng)建一個 Car 實例 car1 時,Python 將自動調(diào)用 init() 方法,并設(shè)置其 color、brand 和 year 實例屬性。接著我們又手動添加了一個 model 實例屬性,并調(diào)用了 describe() 方法,從而輸出了 car1 實例的詳細屬性。
???3、類方法和靜態(tài)方法的應(yīng)用
在Python中,類方法和靜態(tài)方法都是用來處理類的一些數(shù)據(jù)和行為的。兩種方法都是通過類名進行調(diào)用,而不是通過實例對象進行調(diào)用。
一、類方法
在Python中,定義類方法需要使用‘@classmethod’裝飾器。類方法的第一個參數(shù)必須是‘cls’,表示類本身,可以通過‘cls’來調(diào)用類屬性和類方法。
?
代碼示例:
class Person:
total_persons = 0
def __init__(self, name):
self.name = name
Person.total_persons += 1
@classmethod
def show_total_persons(cls):
print("Total persons: ", cls.total_persons)
p1 = Person("Tom")
p2 = Person("Jerry")
Person.show_total_persons()
在上面的代碼中,我們創(chuàng)建了一個‘Person’類來記錄創(chuàng)建的總?cè)藬?shù)。我們定義一個類方法‘show_total_persons()’來顯示總?cè)藬?shù)。在實例化兩個‘Person’對象后,我們使用‘Person.show_total_persons()’來顯示人數(shù)。
二、靜態(tài)方法
在Python中,定義靜態(tài)方法需要使用‘@staticmethod’裝飾器。靜態(tài)方法沒有參數(shù)限制,它只是一個普通函數(shù),涉及到類和對象的問題,都需要在函數(shù)內(nèi)部進行處理。
?
代碼示例:
class Calculator:
@staticmethod
def add(x, y):
return x + y
Calculator.add(3, 5)
在上面的代碼中,我們定義了一個靜態(tài)方法‘a(chǎn)dd()’,然后在類名后面直接調(diào)用它。
三、類方法和靜態(tài)方法的應(yīng)用
在Python中,類方法和靜態(tài)方法的應(yīng)用非常廣泛,可以用來處理一些通用的類方法和靜態(tài)方法。
?
代碼示例:
在我們進行日期計算的時候,經(jīng)常會用到類似的代碼:
from datetime import datetime
now = datetime.now()
current_year = now.year
但是這種代碼重復(fù)了很多次,我們可以定義一個類方法來處理它。
class DateCalculator:
@classmethod
def current_year(cls):
now = datetime.now()
return now.year
print("Current year: ", DateCalculator.current_year())
在上面的代碼中,我們使用類方法‘current_year()’來計算當(dāng)前的年份。使用類方法比多次編寫相同的代碼更加易于維護和編寫。
??4、繼承和子類化
首先,什么是繼承?簡單來說,它是一種讓一個類從另一個類上繼承它的屬性和方法的方式。這個被繼承的類稱作“父類”,而這個繼承的類則稱作“子類”。例如,一個動物類可以是一個父類,而狗類和貓類可以是子類。
?
代碼示例:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print("我是一只動物,我的名字是", self.name)
class Dog(Animal):
def __init__(self, name):
super().__init__(name)
def bark(self):
print("汪汪!")
class Cat(Animal):
def __init__(self, name):
super().__init__(name)
def meow(self):
print("喵喵!")
在這個例子中,我們定義了一個 Animal 類作為一個父類,其包含一個 speak 方法,用于輸出“我是一只動物,我的名字是XXX”。
接下來,我們定義了一個 Dog 類和一個 Cat 類作為 Animal 的子類。在這兩個子類中,我們通過調(diào)用 super().__init__(name)
方法讓 Dog 和 Cat 的 name 屬性繼承自 Animal 的 name 屬性。同時,我們也為它們分別添加了 bark 和 meow 方法,用于輸出不同的聲音。
dog = Dog("旺財")
dog.speak()
dog.bark()
# Output:
# 我是一只動物,我的名字是 旺財
# 汪汪!
cat = Cat("咪咪")
cat.speak()
cat.meow()
# Output:
# 我是一只動物,我的名字是 咪咪
# 喵喵!
可以看到,我們成功地通過繼承讓 Dog 和 Cat 類獲得了 Animal 類的 speak 方法,并且通過子類化添加了不同的方法來實現(xiàn)功能的擴展。這樣的方式既方便又靈活,可以大大簡化我們的代碼。
當(dāng)然,這樣的繼承也可以產(chǎn)生一些問題,比如說實例化的對象可能會因為多層繼承而產(chǎn)生命名沖突的問題。但是,在合理使用的情況下,它是一種非常有用的編程方式。
??5、多重繼承
多重繼承是面向?qū)ο笾蟹浅V匾沂褂脧V泛的一種繼承方式。它允許我們從多個父類中繼承屬性和方法,從而實現(xiàn)更加靈活的代碼設(shè)計。但是,多重繼承也可能會導(dǎo)致一些問題,例如方法名沖突、類的復(fù)雜性增加等等。因此,在使用多重繼承時需要謹慎設(shè)計,盡量避免出現(xiàn)問題。
?
假設(shè)我們有3個類,分別是Animal(動物)、Bird(鳥)和Fish(魚)。Animal類是基類,它包含了所有動物都具有的屬性和方法,例如eat、sleep等等。Bird和Fish類都是繼承自Animal類的子類,并且它們分別添加了自己獨有的屬性和方法,例如Bird類具有fly方法,而Fish類具有swim方法。
那么,如果我們需要創(chuàng)建一個Penguin(企鵝)類,它既需要繼承Bird類的fly方法,又需要繼承Fish類的swim方法,該怎么辦呢?這時候,就需要使用多重繼承了。
代碼示例:
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
print(self.name + "正在吃東西...")
def sleep(self):
print(self.name + "正在睡覺...")
class Bird(Animal):
def fly(self):
print(self.name + "正在飛翔...")
class Fish(Animal):
def swim(self):
print(self.name + "正在游泳...")
class Penguin(Bird, Fish):
def __init__(self, name):
super().__init__(name)
def run(self):
print(self.name + "正在奔跑...")
在上面的代碼中,我們定義了Animal、Bird和Fish三個類,它們分別繼承自Animal類,并且添加了獨有的屬性和方法。接著,我們定義了Penguin類,它同時繼承自Bird類和Fish類,并且添加了自己的run方法。這樣,Penguin類就可以同時擁有Bird類的fly方法和Fish類的swim方法了。
接下來,我們可以創(chuàng)建一個Penguin對象,來測試它的方法是否正常:
penguin = Penguin("小企鵝")
penguin.fly() # 輸出:小企鵝正在飛翔...
penguin.swim() # 輸出:小企鵝正在游泳...
penguin.eat() # 輸出:小企鵝正在吃東西...
penguin.sleep() # 輸出:小企鵝正在睡覺...
penguin.run() # 輸出:小企鵝正在奔跑...
在上面的代碼中,我們創(chuàng)建了一個名為小企鵝的Penguin對象,并且測試了它的飛翔、游泳、吃東西、睡覺和奔跑等方法。可以看到,這些方法都能夠正常運行,并且Penguin類通過多重繼承成功地繼承了Bird類和Fish類的屬性和方法。
希望此篇文章能夠幫助你更好的理解面向?qū)ο螅。。?mark hidden color="red">文章來源:http://www.zghlxwxcb.cn/news/detail-594479.html
面向?qū)ο缶幊蹋∣bject-Oriented Programming,OOP)是一種常用的編程思想,它強調(diào)萬物皆對象,因此在編程時我們可以將現(xiàn)實世界中的事物抽象成程序中的對象,從而更好實現(xiàn)軟件的設(shè)計與開發(fā)。與傳統(tǒng)的基于函數(shù)的編程不同,面向?qū)ο缶幊套⒅赜趯?shù)據(jù)與行為封裝在一起,即對象既包含數(shù)據(jù)狀態(tài),還包含可調(diào)用的行為方法。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-594479.html
面向?qū)ο缶幊痰奶攸c在于,它具有封裝、繼承和多態(tài)三大特性。封裝意味著將對象的狀態(tài)和行為進行封裝,使其對外只暴露必要的接口,從而提高了安全性和可維護性;繼承指的是某個對象可以繼承另一個對象的特性,從而快速構(gòu)建具有相似屬性的對象;多態(tài)是指同一種行為在不同的對象上具有不同的表現(xiàn)形式,即在不同的情境下,同一個方法可以被不同的對象進行調(diào)用。
?
總之,面向?qū)ο缶幊淌且环N強大的編程方式,它具有高度封裝性、靈活的繼承性和強大的多態(tài)性,通過使用對象作為程序的基本處理單元,實現(xiàn)了數(shù)據(jù)和行為的有機結(jié)合,可以使程序更加高效、結(jié)構(gòu)清晰,并方便管理和擴展。
??2、面向?qū)ο蟮奶卣骱蛢?yōu)點
首先要講的是封裝,封裝是OOP中最基本的特征之一,它將數(shù)據(jù)和方法封裝在一個單獨的單元中。對于實現(xiàn)封裝,可以使用類來描述一個對象,類包括數(shù)據(jù)成員和成員函數(shù)。在類的定義中,可以使用關(guān)鍵字public、protected和private來指定成員訪問權(quán)限,以保護數(shù)據(jù)的安全性。
?
代碼示例:
class Student:
def __init__(self, name, age):
# 公共成員變量
self.name = name
# 私有成員變量
self.__age = age
def info(self):
print('姓名:' + self.name)
print('年齡:' + str(self.__age))
# Student類包括了兩個成員變量(name和age)和一個成員函數(shù)(info())。
# 其中,name是公共成員變量,可以被外部訪問;而age被定義成私有成員變量,只能在類內(nèi)部訪問。
# 通過封裝,可以保證數(shù)據(jù)不被外部隨意修改,保證代碼的安全性。
其次要講的就是封裝,繼承可以讓子類繼承父類的屬性和方法,并且在基礎(chǔ)上進行擴展。繼承是代碼復(fù)用的一種重要方式,它可以減少代碼冗余,增加程序的可維護性。
?
代碼示例:
class Animal:
def __init__(self, name):
# 私有成員變量
self.__name = name
def eat(self):
print(self.__name + '開始偷吃零食')
class Cat(Animal):
def __init__(self, name):
# 調(diào)用父類的構(gòu)造函數(shù)
super().__init__(name)
def run(self):
print(self._name + '開始逃跑')
# Animal類是一個基類,Cat類繼承了Animal類的屬性和方法,并且增加了一個新的方法scratch()。
# 通過繼承,在Cat類中可以調(diào)用Animal類的成員函數(shù)eat()。
最后要講的就是,多態(tài)指的是同一個行為在不同情況下有不同的表現(xiàn)形式。在OOP中,多態(tài)是一種通過繼承、重寫和接口實現(xiàn)的機制,它可以讓不同類的對象對同一消息做出不同的響應(yīng)。
?
代碼示例:
class Animal:
def __init__(self, name):
# 私有成員變量
self.__name = name
def make_sound(self):
# 抽象方法
pass
class Cat(Animal):
def __init__(self, name):
# 調(diào)用父類的構(gòu)造函數(shù)
super().__init__(name)
def make_sound(self):
print(self.__name + '貓叫')
class Dog(Animal):
def __init__(self, name):
# 調(diào)用父類的構(gòu)造函數(shù)
super().__init__(name)
def make_sound(self):
print(self.__name + '狗叫')
# Animal類包含一個抽象方法make_sound(),它在子類中被重寫,實現(xiàn)了多態(tài)。
# Cat類和Dog類都是Animal類的子類,它們重寫了make_sound()方法
# 使得同一個行為(make_sound())在不同情況下有不同的表現(xiàn)形式。
??3、類與對象的關(guān)系和定義
類與對象的關(guān)系我們可以用一個案例類比,假設(shè)你要買一張飛機票,并且你需要填寫一份訂票表格。這份訂票表格就相當(dāng)于一個類,它有一些屬性(如你的姓名、航班編號、起點和終點等信息),而你填寫的表格就是對象。在填寫表格時,你需要根據(jù)表格的屬性來輸入相關(guān)信息,就像在使用類時需要調(diào)用類的屬性和方法一樣。
類與對象的關(guān)系
類是一個模板,對象是根據(jù)這個模板創(chuàng)建的具體實例。如果將類比喻為蛋糕模具,那么對象就是蛋糕。一個類可以創(chuàng)建多個對象,它們之間是獨立的,互相不影響。
類和對象的定義
類是一種用戶自定義的數(shù)據(jù)類型,它由數(shù)據(jù)和方法組成。數(shù)據(jù)表示屬性,方法表示行為。一個類可以包含多個屬性和方法。屬性是類的成員變量,可以存儲數(shù)據(jù)。方法是一組操作數(shù)據(jù)的代碼,它們可以實現(xiàn)某些功能或者改變屬性的值。
給大家展示一個通用的格式:
class 類名:
類屬性 = 值
def __init__(self, 參數(shù)):
self.屬性1 = 參數(shù)1
self.屬性2 = 參數(shù)2
def 方法1(self, 參數(shù)):
# 方法代碼
def 方法2(self, 參數(shù)):
# 方法代碼
class
是聲明類的關(guān)鍵字。__init__
是類的構(gòu)造方法,當(dāng)創(chuàng)建類的對象時,會自動調(diào)用這個方法。self
表示對象本身,其他參數(shù)就是對象的屬性。- 屬性是類的成員變量,可以在類內(nèi)部和外部使用??梢栽陬愅馐褂妙惷L問類屬性,如:
類名.類屬性
。- 方法是類的成員函數(shù),接受的第一個參數(shù)是
self
,表示對象本身。在類內(nèi)使用方法時,不需要傳遞這個參數(shù)。外部訪問方法時,需要在對象后面加上方法名,如:對象.方法名()
。
舉一個簡單的例子 :
class Dog:
# 類屬性
species = '犬科'
# 構(gòu)造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 方法
def bark(self):
print("汪汪汪")
# 創(chuàng)建對象
dog1 = Dog('大黃', 2)
dog2 = Dog('二黃', 1)
# 訪問屬性
print(dog1.name)
print(dog2.age)
# 調(diào)用方法
dog1.bark()
??4、封裝、繼承和多態(tài)的概念和應(yīng)用
首先介紹封裝的概念,封裝是指將數(shù)據(jù)和行為打包到一個類中,并可以控制外部訪問的級別。封裝可以保護數(shù)據(jù)和方法的訪問,并且提高代碼的可維護性。我們可以利用訪問控制修飾符來實現(xiàn)封裝,包括公有、私有、受保護和包訪問等四種級別。
簡單的來說其實就是,?封裝就是不讓人靠近自己的東西,保護自己的隱私
?
代碼示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
return self.name
def get_age(self):
return self.age
def set_name(self, name):
self.name = name
def set_age(self, age):
self.age = age
person = Person("ZT", 20)
person.set_name("Tim")
print(person.get_name()) # 輸出 Tim
接下來就是繼承,繼承是指一個類可以從父類中繼承方法和屬性。如果父類的某個屬性或方法也在子類中定義了,那么子類會重寫父類的屬性或方法,這樣子類可以更好地針對自己的特定要求來實現(xiàn)相應(yīng)的功能。有人說繼承可以使代碼更加簡潔,但是過度的繼承反而會使代碼變得非常復(fù)雜。---- 繼承其實就像是血緣關(guān)系,你可以從你的祖先那里繼承一些好的特點,但也不能完全成為他們。
?
代碼示例:
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
print(self.name + '在吃東西')
class Dog(Animal):
def __init__(self, name):
super().__init__(name)
def bark(self):
print(self.name + '在汪汪叫')
dog = Dog('小狗')
dog.eat()
dog.bark()
多態(tài)是指對象可以用多種形態(tài)來引用。這樣做可以使代碼更加靈活,因為同樣的操作可以應(yīng)用于不同的類型。多態(tài)有兩種實現(xiàn)方式,一種是基于繼承的實現(xiàn),在這種實現(xiàn)中,父類定義一些通用的方法,子類則可以重寫這些方法并實現(xiàn)不同的功能。另一種實現(xiàn)方式是接口,這種實現(xiàn)方式可以讓不同的類實現(xiàn)同一個接口,從而實現(xiàn)多態(tài)。
?
代碼示例:
class Animal:
def move(self):
pass
class Dog(Animal):
def move(self):
print("狗在跑")
class Cat(Animal):
def move(self):
print("貓在爬")
class Zoo:
def __init__(self):
self.animals = []
def addAnimal(self, animal):
self.animals.append(animal)
def moveAll(self):
for animal in self.animals:
animal.move()
zoo = Zoo()
zoo.addAnimal(Dog())
zoo.addAnimal(Cat())
zoo.moveAll()
# 我們創(chuàng)建了一個動物園Zoo,并在其中添加了一只狗和一只貓。
# 當(dāng)我們調(diào)用moveAll()方法時,它們會分別按照自己的方式移動,即狗會跑,貓會爬。
給大家寫一個綜合了封裝,多態(tài),繼承的案例代碼:
class Animal:
def __init__(self, name, age, gender):
self.__name = name
self.__age = age
self.__gender = gender
def __get_name(self):
return self.__name
def __get_age(self):
return self.__age
def __get_gender(self):
return self.__gender
def eat(self):
print('吃飯中...')
def sleep(self):
print('睡覺中...')
class Dog(Animal):
def __init__(self, name, age, gender, breed):
super().__init__(name, age, gender)
self.__breed = breed
def bark(self):
print('汪汪!')
def play(self):
print('玩球中...')
class Cat(Animal):
def __init__(self, name, age, gender, color):
super().__init__(name, age, gender)
self.__color = color
def meow(self):
print('喵喵!')
def sleep(self):
print('打盹中...')
def animal_action(animal):
animal.eat()
animal.sleep()
if __name__ == '__main__':
dog = Dog('小黃', 3, '雄性', '金毛')
cat = Cat('小花', 2, '雌性', '橘黃色')
animal_action(dog)
animal_action(cat)
Python中的面向?qū)ο缶幊袒A(chǔ)
???1、創(chuàng)建類和對象
首先,類是我們在面向?qū)ο缶幊讨械幕A(chǔ),它是一種用來描述具有相同屬性和方法的對象集合的藍圖。舉個例子,我們可以創(chuàng)建一個名為 "人" 的類,這個類里面包含了姓名、年齡、性別等屬性,以及 eat、sleep、work 等方法。然后我們可以實例化這個 "人" 類,創(chuàng)建很多具有不同屬性的人的對象。
?
代碼示例:
# 首先,我們來創(chuàng)建一個“人”類
class Person:
# 把屬性放在 __init__ 方法里面,注意第一個參數(shù)永遠是 self,代表該類的實例
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
# 這里是一個日常生活中的行為,寫成方法
def eat(self):
print("{} 在吃飯".format(self.name))
# 再來一個睡覺
def sleep(self):
print("{} 正在睡覺".format(self.name))
# 最后一個工作
def work(self):
print("{} 在工作".format(self.name))
# 現(xiàn)在我們創(chuàng)建兩個人的對象
p1 = Person("小明", 18, "男")
p2 = Person("小紅", 22, "女")
# 通過對象調(diào)用方法
p1.eat() # 小明 在吃飯
p2.sleep() # 小紅 正在睡覺
我們創(chuàng)建了一個名為 "Person" 的類,并定義了 "name"、 "age"、 "gender" 等屬性,然后定義了 "eat"、 "sleep"、 "work" 等方法。通過實例化這個類,我們可以創(chuàng)建不同名字、不同年齡、不同性別的人,來調(diào)用這些方法。
???2、初始化方法和實例屬性
初始化方法是在創(chuàng)建一個新的對象實例時,執(zhí)行其中的代碼,以初始化對象的屬性和狀態(tài)。Python 中的初始化方法通常為 init(),它是所有類中的可選方法。當(dāng)您創(chuàng)建一個類的新實例時,Python 將自動調(diào)用 init() 方法,并將該實例作為第一個參數(shù)傳遞給它,并使用該實例來設(shè)置各種屬性和狀態(tài)。
?
代碼示例:
首先,我們定義了一個名為 Person 的類,并在其中編寫了初始化方法 init():
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
在上面的代碼中,我們定義了一個新的類 Person,并在其中定義了初始化方法 init()。此方法將 name 和 age 作為參數(shù)傳遞,并使用 self.name 和 self.age 對象屬性分別賦值。
接下來創(chuàng)建一個 Person 實例,并訪問其中的屬性:
person1 = Person("小明", 20)
print("這個人的名字是:", person1.name)
print("這個人的年齡是:", person1.age)
# 輸出結(jié)果是:
# 這個人的名字是:小明
# 這個人的年齡是:20
在 Python 中,實例屬性是方法內(nèi)部定義的屬性,它們與類的實例相關(guān)聯(lián),并且每個實例都有自己的一套實例屬性。
代碼示例:
我定義了一個名為 Car 的類,并為每個實例定義了一組屬性:
class Car:
def __init__(self):
self.color = "黑色"
self.brand = "奧迪"
self.year = 2023
def describe(self):
print("這輛車是一輛 %d 年的 %s %s ,顏色為 %s" % (self.year, self.brand, self.model, self.color))
car1 = Car()
car1.model = "Q7" # 為對象手動添加一個屬性
car1.describe()
# 輸出結(jié)果是:
# 這輛車是一輛 2023 年的 奧迪 Q7 ,顏色為 黑色
在上面的代碼中,我們定義了一個新的類 Car,并在其中編寫了初始化方法 init()。該方法設(shè)置了一個名為 color、brand 和 year 的實例屬性。同時,該類還定義了一個名為 describe() 的方法,該方法將輸出具體的汽車屬性。
當(dāng)我們創(chuàng)建一個 Car 實例 car1 時,Python 將自動調(diào)用 init() 方法,并設(shè)置其 color、brand 和 year 實例屬性。接著我們又手動添加了一個 model 實例屬性,并調(diào)用了 describe() 方法,從而輸出了 car1 實例的詳細屬性。
???3、類方法和靜態(tài)方法的應(yīng)用
在Python中,類方法和靜態(tài)方法都是用來處理類的一些數(shù)據(jù)和行為的。兩種方法都是通過類名進行調(diào)用,而不是通過實例對象進行調(diào)用。
一、類方法
在Python中,定義類方法需要使用‘@classmethod’裝飾器。類方法的第一個參數(shù)必須是‘cls’,表示類本身,可以通過‘cls’來調(diào)用類屬性和類方法。
?
代碼示例:
class Person:
total_persons = 0
def __init__(self, name):
self.name = name
Person.total_persons += 1
@classmethod
def show_total_persons(cls):
print("Total persons: ", cls.total_persons)
p1 = Person("Tom")
p2 = Person("Jerry")
Person.show_total_persons()
在上面的代碼中,我們創(chuàng)建了一個‘Person’類來記錄創(chuàng)建的總?cè)藬?shù)。我們定義一個類方法‘show_total_persons()’來顯示總?cè)藬?shù)。在實例化兩個‘Person’對象后,我們使用‘Person.show_total_persons()’來顯示人數(shù)。
二、靜態(tài)方法
在Python中,定義靜態(tài)方法需要使用‘@staticmethod’裝飾器。靜態(tài)方法沒有參數(shù)限制,它只是一個普通函數(shù),涉及到類和對象的問題,都需要在函數(shù)內(nèi)部進行處理。
?
代碼示例:
class Calculator:
@staticmethod
def add(x, y):
return x + y
Calculator.add(3, 5)
在上面的代碼中,我們定義了一個靜態(tài)方法‘a(chǎn)dd()’,然后在類名后面直接調(diào)用它。
三、類方法和靜態(tài)方法的應(yīng)用
在Python中,類方法和靜態(tài)方法的應(yīng)用非常廣泛,可以用來處理一些通用的類方法和靜態(tài)方法。
?
代碼示例:
在我們進行日期計算的時候,經(jīng)常會用到類似的代碼:
from datetime import datetime
now = datetime.now()
current_year = now.year
但是這種代碼重復(fù)了很多次,我們可以定義一個類方法來處理它。
class DateCalculator:
@classmethod
def current_year(cls):
now = datetime.now()
return now.year
print("Current year: ", DateCalculator.current_year())
在上面的代碼中,我們使用類方法‘current_year()’來計算當(dāng)前的年份。使用類方法比多次編寫相同的代碼更加易于維護和編寫。
??4、繼承和子類化
首先,什么是繼承?簡單來說,它是一種讓一個類從另一個類上繼承它的屬性和方法的方式。這個被繼承的類稱作“父類”,而這個繼承的類則稱作“子類”。例如,一個動物類可以是一個父類,而狗類和貓類可以是子類。
?
代碼示例:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print("我是一只動物,我的名字是", self.name)
class Dog(Animal):
def __init__(self, name):
super().__init__(name)
def bark(self):
print("汪汪!")
class Cat(Animal):
def __init__(self, name):
super().__init__(name)
def meow(self):
print("喵喵!")
在這個例子中,我們定義了一個 Animal 類作為一個父類,其包含一個 speak 方法,用于輸出“我是一只動物,我的名字是XXX”。
接下來,我們定義了一個 Dog 類和一個 Cat 類作為 Animal 的子類。在這兩個子類中,我們通過調(diào)用
super().__init__(name)
方法讓 Dog 和 Cat 的 name 屬性繼承自 Animal 的 name 屬性。同時,我們也為它們分別添加了 bark 和 meow 方法,用于輸出不同的聲音。
dog = Dog("旺財")
dog.speak()
dog.bark()
# Output:
# 我是一只動物,我的名字是 旺財
# 汪汪!
cat = Cat("咪咪")
cat.speak()
cat.meow()
# Output:
# 我是一只動物,我的名字是 咪咪
# 喵喵!
可以看到,我們成功地通過繼承讓 Dog 和 Cat 類獲得了 Animal 類的 speak 方法,并且通過子類化添加了不同的方法來實現(xiàn)功能的擴展。這樣的方式既方便又靈活,可以大大簡化我們的代碼。
當(dāng)然,這樣的繼承也可以產(chǎn)生一些問題,比如說實例化的對象可能會因為多層繼承而產(chǎn)生命名沖突的問題。但是,在合理使用的情況下,它是一種非常有用的編程方式。
??5、多重繼承
多重繼承是面向?qū)ο笾蟹浅V匾沂褂脧V泛的一種繼承方式。它允許我們從多個父類中繼承屬性和方法,從而實現(xiàn)更加靈活的代碼設(shè)計。但是,多重繼承也可能會導(dǎo)致一些問題,例如方法名沖突、類的復(fù)雜性增加等等。因此,在使用多重繼承時需要謹慎設(shè)計,盡量避免出現(xiàn)問題。
?
假設(shè)我們有3個類,分別是Animal(動物)、Bird(鳥)和Fish(魚)。Animal類是基類,它包含了所有動物都具有的屬性和方法,例如eat、sleep等等。Bird和Fish類都是繼承自Animal類的子類,并且它們分別添加了自己獨有的屬性和方法,例如Bird類具有fly方法,而Fish類具有swim方法。
那么,如果我們需要創(chuàng)建一個Penguin(企鵝)類,它既需要繼承Bird類的fly方法,又需要繼承Fish類的swim方法,該怎么辦呢?這時候,就需要使用多重繼承了。
代碼示例:
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
print(self.name + "正在吃東西...")
def sleep(self):
print(self.name + "正在睡覺...")
class Bird(Animal):
def fly(self):
print(self.name + "正在飛翔...")
class Fish(Animal):
def swim(self):
print(self.name + "正在游泳...")
class Penguin(Bird, Fish):
def __init__(self, name):
super().__init__(name)
def run(self):
print(self.name + "正在奔跑...")
在上面的代碼中,我們定義了Animal、Bird和Fish三個類,它們分別繼承自Animal類,并且添加了獨有的屬性和方法。接著,我們定義了Penguin類,它同時繼承自Bird類和Fish類,并且添加了自己的run方法。這樣,Penguin類就可以同時擁有Bird類的fly方法和Fish類的swim方法了。
接下來,我們可以創(chuàng)建一個Penguin對象,來測試它的方法是否正常:
penguin = Penguin("小企鵝")
penguin.fly() # 輸出:小企鵝正在飛翔...
penguin.swim() # 輸出:小企鵝正在游泳...
penguin.eat() # 輸出:小企鵝正在吃東西...
penguin.sleep() # 輸出:小企鵝正在睡覺...
penguin.run() # 輸出:小企鵝正在奔跑...
在上面的代碼中,我們創(chuàng)建了一個名為小企鵝的Penguin對象,并且測試了它的飛翔、游泳、吃東西、睡覺和奔跑等方法。可以看到,這些方法都能夠正常運行,并且Penguin類通過多重繼承成功地繼承了Bird類和Fish類的屬性和方法。
希望此篇文章能夠幫助你更好的理解面向?qū)ο螅。。?mark hidden color="red">文章來源:http://www.zghlxwxcb.cn/news/detail-594479.html
?
到了這里,關(guān)于Python面向?qū)ο笤斀猓ǚ浅T敿殻┑奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!