1. 程式人生 > >day6--面向對象初識

day6--面向對象初識

動態 構造 work DC 類定義 方法 減少 soup 所有

一面向過程與面向對象

面向過程:

流水線式的思維,順著流程進行下去,類似於代碼的堆疊,重視步驟

優點:不需要考慮太多東西,想到一個功能就寫一個功能,堆疊代碼

缺點:過程往往是先後執行的,要想變換功能或者增加功能,就要考慮重新堆疊大部分或者所有代碼了,牽一發而動全身

面向對象:

將事務分解成各個對象,可以給這個對象附加相應的功能,後面的東西一旦調用,這些功能或者方法也就自然的擁有了

優點:對象可擴展,並可以單獨修改,調用的地方會立刻顯現,我是一塊磚哪裏需要哪裏搬

缺點:無法預測出現問題的具體地方,對象和對象之間融合到一塊了,找出問題需要很長時間

面向對象在實際運用中還是很普遍的,將事務拆分成各個對象,大家可以分頭去做,往往進度比較快

面向對象的實現需要類和對象

二 類和對象

類:相當於一個模板,裏面有這個模板的函數,變量,屬性,方式方法等

對象:根據模板來創建,這樣自然而然對象就擁有了類裏面的東西

2.1 定義一個類

一個類的定義有其獨特的方式,類名首字母大寫,裏面定義的函數,其參數必須有self

例如:

class Person:   #定義一個人類
    role = person  #人的角色屬性都是人
    def walk(self):  #人都可以走路,也就是有一個走路方法
        print("person is walking...")
print(Person.role)  #查看人的role屬性
print(Person.walk) #引用人的走路方法,註意,這裏不是在調用

2.2實例化

類名加括號就是實例化,會自動觸發__init__函數的運行,可以用它來為每個實例定制自己的特征

例如:

class Person:   #定義一個人類
    role = person  #人的角色屬性都是人
    def __init__(self,name):
        self.name = name  # 每一個角色都有自己的昵稱;
        
    def walk(self):  #人都可以走路,也就是有一個走路方法
        print("person is walking...
") print(Person.role) #查看人的role屬性 print(Person.walk) #引用人的走路方法,註意,這裏不是在調用

實例化的過程就是類——>對象的過程

2.3類的屬性

技術分享圖片
dir(類名):查出的是一個名字列表
類名.__dict__:查出的是一個字典,key為屬性名,value為屬性值

二:特殊的類屬性
類名.__name__# 類的名字(字符串)
類名.__doc__# 類的文檔字符串
類名.__base__# 類的第一個父類(在講繼承時會講)
類名.__bases__# 類所有父類構成的元組(在講繼承時會講)
類名.__dict__# 類的字典屬性
類名.__module__# 類定義所在的模塊
類名.__class__# 實例對應的類(僅新式類中)
View Code

2.4類的查看

類的兩種變量:靜態變量和動態變量

例如:

技術分享圖片
class Person:  # class 關鍵字,定義了一個類
    ‘‘‘
    類裏面的所有內容
    ‘‘‘
    animal = 高級動物 # 靜態變量
    soup = 有思想  # 靜態變量

    def __init__(self,name,sex,eye,high,weight,):  # 構造方法

        self.eye = eye  # 屬性
        self.name = name
        self.sex = sex
        self.high = high
        self.weight = weight
        print(666)

    def work(self): # 動態變量,動態方法,方法
        print(self)
        # self.job = ‘IT‘
        print(人會工作....)
View Code

1,類名.__dict__方法 只能查看,不能增刪改。

# print(Person.__dict__)
# print(Person.__dict__[‘animal‘])

#查詢動態變量

print(Person.__dict__[‘work‘](11))

2 類名.變量名 可增刪改查

# print(Person.animal)
# print(Person.soup)
# Person.kind = ‘有性格‘
# Person.animal = ‘低等動物‘
# del Person.kind

查詢動態變量

#Person.work(11)

2.5對象的查看

實例化一個對象內部進行了三步

技術分享圖片
# 內部進行三步:
# 1,實例化一個對象,在內存中產生一個對象空間。
# 2,自動執行init方法,並將這個空間對象。 <__main__.Person object at 0x0000000001F5ABE0> 傳給self
# 3,通過構造方法裏的代碼給空間對象添加一些屬性,並返回給對象。
View Code

對象的查看與類的查看類似,只是將類名換成了對象名

類的靜態屬性是共享給對象的,類的動態屬性是綁定給對象的

三面向對象的三大特性

3.1繼承

繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類

繼承簡單的來說就是子繼承父

繼承分為:單繼承和多繼承

一些對象具體相同的功能時,可以在它們的父類中實現,這樣的話可以減少很多代碼

註:除了子類和父類的稱謂,你可能看到過 派生類 和 基類 ,他們與子類和父類只是叫法不同而已。

查看繼承

類名.__bases__ #__base__只查看從左到右繼承的第一個子類,__bases__則是查看所有繼承的父類

如果沒有指定基類,python會默認繼承object類,object是所有python類的基類


例如:leiming.__bases__

#結果為 (<class ‘object‘>,)

有很多情況是一個子類往往有很多父類,這個是多繼承,它又是如何繼承的

1、Python的類可以繼承多個類,Java和C#中則只能繼承一個類

2、Python的類如果繼承了多個類,那麽其尋找方法的方式有兩種,分別是:深度優先廣度優先

技術分享圖片

  • 當類是經典類時,多繼承情況下,會按照深度優先方式查找
  • 當類是新式類時,多繼承情況下,會按照廣度優先方式查找

經典類和新式類,從字面上可以看出一個老一個新,新的必然包含了跟多的功能,也是之後推薦的寫法,從寫法上區分的話,如果 當前類或者父類繼承了object類,那麽該類便是新式類,否則便是經典類。

技術分享圖片
class D:

    def bar(self):
        print ‘D.bar‘


class C(D):

    def bar(self):
        print ‘C.bar‘


class B(D):

    def bar(self):
        print ‘B.bar‘


class A(B, C):

    def bar(self):
        print ‘A.bar‘

a = A()
# 執行bar方法時
# 首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中麽有,則繼續去D類中找,如果D類中麽有,則繼續去C類中找,如果還是未找到,則報錯
# 所以,查找順序:A --> B --> D --> C
# 在上述查找bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了
a.bar()
經典類多繼承 技術分享圖片
class D(object):

    def bar(self):
        print D.bar


class C(D):

    def bar(self):
        print C.bar


class B(D):

    def bar(self):
        print B.bar


class A(B, C):

    def bar(self):
        print A.bar

a = A()
# 執行bar方法時
# 首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中麽有,則繼續去C類中找,如果C類中麽有,則繼續去D類中找,如果還是未找到,則報錯
# 所以,查找順序:A --> B --> C --> D
# 在上述查找bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了
a.bar()
新式類多繼承

待續。。。。。

day6--面向對象初識