溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python全棧開發(fā)之面向?qū)ο?/h1>
發(fā)布時間:2020-06-04 04:14:11 來源:網(wǎng)絡 閱讀:708 作者:灰白世界 欄目:編程語言

No.1 概念

面向?qū)ο蟮奶攸c?

注重對象和指責,不同的對象承擔各自的指責

更加適合對復雜的需求變化,專門應對復雜項目開發(fā),提供固定的套路

面向?qū)ο髲娬{(diào)的是誰來做,面向過程強調(diào)的如何做

什么是類

類是對一群具有相同特征或者行為的事物統(tǒng)稱,是抽象的,不能直接使用,特征被稱為屬性,行為被稱為方法,類就是一個模板

什么是對象

對象是由類創(chuàng)建出來的一個具體存在,可以直接使用,通過哪個類創(chuàng)建出來的實例,就擁有哪個類中定義的特征和行為

類和對象的關(guān)系

類是模板,對象是根據(jù)類這個模板創(chuàng)建出來的,先有類,再有對象

類只有一個,對象有多個

類中定義的方法屬性都會存在對象中,不多不少

不同的對象之間的屬性不盡相同

No.2 類的創(chuàng)建

方法名 類型 作用
new 方法 通過類()創(chuàng)建對象時,向內(nèi)存申請空間,并將對象引用傳遞給init
init 方法 對象初始化時,會調(diào)用此方法
del 方法 對象被銷毀時,會調(diào)用此方法
str 方法 返回對象的描述信息
class Cat:
    """這是一個貓類"""

    def eat(self):
        print("小貓愛吃魚")

    def drink(self):
        print("小貓在喝水")

tom = Cat()
tom.drink()
tom.eat()

對象中的self參數(shù)

在類封裝的方法內(nèi)部,self就表示當前調(diào)用方法的對象自己
調(diào)用方法時,不需要傳遞self參數(shù)
在方法內(nèi)部可以通過self.訪問對象的屬性
也可以通過self.調(diào)用其他的對象方法
class Cat:
    def __init(self,name)
        self.name = name

    def eat(self):
        print("%s 愛吃魚" % self.name)

tom = Cat('mimimi')
tom.eat()

No.3 封裝

封裝是面向?qū)ο缶幊痰囊淮筇攸c

面向?qū)ο髮傩院头椒ǚ庋b到一個抽象的類中

外部使用類創(chuàng)建對象,然后讓對象調(diào)用方法

對象方法的細節(jié)都被定義到類的內(nèi)部

No.4 繼承

DFS(深度優(yōu)先算法):

class E:
    def say(self):
        print('E')
class D:
    pass
class C(E):
    pass
class B(D):
    pass
class A(B,C):
    pass
a = A()
a.say()
# 查找順序 A->B->D->C->E

BFS(廣度優(yōu)先算法):

class E:
    def say(self):
        print('E')
class D:
    pass
class C(E):
    pass
class B(D):
    pass
class A(B,C):
    pass
a = A()
a.say()
# 查找順序 A->B->C->D->E

C3(算法):

class F:
    def say(self):
        print('F')
class E(F):
    pass
class D(F):
    pass
class C(E):
    pass
class B(D):
    pass
class A(B,C):
    pass
a = A()
a.say()
print(A.__mro__) # (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class '__main__.F'>, <class 'object'>)
# 查找順序 A->B-?>D-C->E-F

No.5 多態(tài)

Python中不支持多態(tài),也不用支持多態(tài),Python是一種多態(tài)語言,崇尚鴨子類型,鴨子類型的概念來自于:“當看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子,Python不會檢查類型是不是鴨子,只要它擁有鴨子的特征,就可以被正確的調(diào)用

class Duck:
    def speak(self):
        print('嘎嘎嘎...')
class Dog:
    def speak(self):
        print('汪汪汪...')
class Cat:
    def speak(self):
        print('喵喵喵...')
animal = []
animal.append(Duck)
animal.append(Dog)
animal.append(Cat)
for i in animal:
    i().speak()
# 嘎嘎嘎...
# 汪汪汪...
# 喵喵喵...

No.6 類方法、靜態(tài)方法、實例方法

實例方法第一個參數(shù)必須是self,通過實例方法來傳遞實例的屬性和方法,只能同實例來調(diào)用,靜態(tài)方法使@staticmethod裝飾器來定義,參數(shù)隨意,靜態(tài)方法是一個獨立的函數(shù),它僅僅依托于類的命名空間,不會涉及到類是屬性和方法的作,靜態(tài)方法因為沒有參數(shù)綁定到該類所以僅僅提供函數(shù)功能,不能調(diào)用實例屬性或靜態(tài)屬性,類方法使用@classsmethod來定義,第一個參數(shù)必須是cls,通過它傳遞類的屬性和方法,類方法只能調(diào)用靜態(tài)屬性

class Data():
    def __init__(self,year,month,day):
        self.year = year
        self.month = month
        self.day = day
    @staticmethod
    def static_method(date_str):
        year,month,day = tuple(date_str.split('-'))
        return Data(int(year),int(month),int(day))
    @classmethod
    def class_method(cls,date_str):
        year, month, day = tuple(date_str.split('-'))
        return cls(int(year), int(month), int(day))
    def object_method(self):
        print(self.year,self.month,self.day,sep='-')
if __name__ == '__main__':
    date = Data(2018,9,15)
    date.object_method() # 2018-9-15
    date = Data.class_method('2018-9-16')
    date.object_method() # 2018-9-16
    date = Data.static_method("2018-9-17")
    date.object_method() # 2018-9-17

No.7 類變量和實例變量

類變量,可以通過類調(diào)用,也可以通過實例調(diào)用,在內(nèi)存中之存在一份

實例變量,只能通過實例調(diào)用,每個對象都有一份

class Person:
    country = "中國"
    def __init__(self,name,age):
        self.name = name
        self.age = age

p1 = Person('kernel',18)
print(p1.name) # kernel
print(p1.age) # 18
print(p1.country) # 中國
print(Person.country) # 中國
p1.country = "美國" # 當通過對象修改類變量時,將會在該對象創(chuàng)建一個和類變量同名的變量,類變量依然不變
print(p1.country) # 美國
print(Person.country) # 中國
p2 = Person('alex',38)
print(p2.name) # alex
print(p2.age) # 38
print(p2.country) # 中國

No.8 私有屬性和數(shù)據(jù)封裝

class User:
    def __init__(self,name,age):
        self.name = name
        self.__age = age
    def get_age(self):
        print(self.__age)
    def set_age(self,age):
        self.__age = age
if __name__ == '__main__':
    u = User('kernel',18)
    # print(u.__age) # AttributeError: 'User' object has no attribute '__age' 好吧,私有屬性不讓我訪問,但是真的無法訪問嗎
    print(u._User__age) # 但這又是什么鬼呢?當然我們不建議這么干
    u.set_age(19) 
    u._User__age=20 # 當然,設置也可以這樣
    u.get_age() # 20

No.9 單例模式

new方法

使用類名()創(chuàng)建對象,首先會調(diào)用new方法為對象分配空間,它的主要作用就是在內(nèi)存中為對象分配空間和返回對象的引用,Python解釋器得到對象的引用后,將引用傳遞給init

讓類創(chuàng)建的對象,在系統(tǒng)中只有唯一的一個實例

定義一個類屬性,初始值是None,用于記錄單例對象的引用

重寫new方法

如果類屬性是None,調(diào)用方法申請空間,并在類屬性中記錄

返回類屬性中紀錄的對象引用

class MusicPlayer(object):
    instance = None # 記錄第一個被創(chuàng)建對象的引用
    init_flag = False # 記錄是否執(zhí)行過初始化動作

    def __new__(cls, *args, **kwargs):
        if cls.instance is None:#  判斷類屬性是否是空對象
            cls.instance = super().__new__(cls)  #  調(diào)用父類的方法,為第一個對象分配空間
        return cls.instance # 返回類屬性保存的對象引用

    def __init__(self):
        if not MusicPlayer.init_flag:
            MusicPlayer.init_flag = True

player1 = MusicPlayer() # <__main__.MusicPlayer object at 0x0000017C297F99E8>
print(player1)
player2 = MusicPlayer() # <__main__.MusicPlayer object at 0x0000017C297F99E8>
print(player2)
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI