day 19

1. 面向對象思想

什麼是面向對象?編程

面向對象是一種編程思想。函數

  • 面向過程編程code

    核心是「過程」二字,過程指的是作事情的步驟,即先作什麼,而後作什麼,最後作什麼。對象

    基於該編程思想編寫程序,就相似於一條工廠流水線,一種機械式的思惟方式。it

    • 優勢io

      邏輯清晰,將複雜的問題流程化,進而簡單化。面向對象編程

    • 缺點ast

      可擴展性差。function

  • 面向對象編程

    核心是「對象」二字,對象指的是特徵與技能的結合體。

    基於該編程思想編寫程序,就相似於在創造世界,一種上帝式的思惟方式。

    • 優勢

      可擴展性高。

    • 缺點

      編寫程序的複雜程度要遠高於面向過程編程思想。

優先使用面向過程仍是面向對象?

實際編程中須要面向過程結合面向對象一塊兒使用

2. 類和對象

2.1 類和對象的定義

  1. 什麼是對象

    特徵和技能的結合體。

  2. 什麼是類

    一系列對象相同的特徵與技能的結合體。

2.2 類和對象的產生

  1. 在現實世界中

    對象是一個個具體存在的事物,類是由人類文明的發展抽象總結出來的。

  2. 在程序中

    必須遵循,先有類,再由對象。

2.3 在現實世界中定義類和對象

現實世界中,現有對象,後有類。

現實中的貓對象:

  • 貓對象1
    • 特徵
      • 屬性:萌
      • 品種:橘貓
      • 年齡:2
      • 體重:10
    • 技能
      • 抓老鼠
      • 爬樹
  • 貓對象2
    • 特徵
      • 屬性:萌
      • 品種:狸花
      • 年齡:5
      • 體重:7
    • 技能
      • 抓老鼠
      • 爬樹

根據對象抽象出類:

  • 貓類
    • 相同的特徵
      • 屬性:萌
    • 相同的技能
      • 抓老鼠
      • 爬樹

2.4 在程序中定義類

程序中先定義類,再產生對象。

2.4.1 語法

class 類名:
    對象相同的特徵
    對象相同的技能

#    class: 用來定義類的,class後跟的是類名。
#    類名: 類的名字,用來調用創造對象的。

# 注意: 類名必需要遵循駝峯命名法,python在定義變量與函數時不推薦使用,但在定義類時推薦使用。

定義類時發生的事情:

  • 類在定義時,會產生一個類的名稱空間

  • 類內部的全部名字,都會存進名稱空間

    注意:類在定義階段已經產生好了名稱空間,執行python文件時會執行類內部的代碼

  • 定義一個類:

class Cat:
    att = 'cute'

    def catch(self):
        print('catch mouse.')

    def climb(self):
        print('climb up a tree.')

2.4.2 類的操做

  • 查看類的名稱空間內全部名字

    print(Cat.__dict__)

    運行結果:

    {'__module__': '__main__', 'att': 'cute', 'catch': <function Cat.catch at 0x0000027ED1EB28C8>, 'climb': <function Cat.climb at 0x0000027EE0F3FB70>, '__dict__': <attribute '__dict__' of 'Cat' objects>, '__weakref__': <attribute '__weakref__' of 'Cat' objects>, '__doc__': None}
    
    Process finished with exit code 0
  • print(Cat.att)

    運行結果:

    cute
  • Cat.att='lovely'
    print(Cat.att)

    運行結果:

    lovely
    
    Process finished with exit code 0
  • Cat.master='tom'
    print(Cat.master)

    運行結果:

    tom
    
    Process finished with exit code 0
  • Cat.master='tom'
    print(Cat.master)
    
    del Cat.master
    print(Cat.master)

    運行結果:

    tom
    Traceback (most recent call last):
      File "D:/data/python/Learn/courses/day19/01 課程內容/代碼/1 類.py", line 53, in <module>
        print(Cat.master)
    AttributeError: type object 'Cat' has no attribute 'master'
    
    Process finished with exit code 1

2.5 在程序中定義對象

2.5.1 語法

類名 + () 調用類產生對象。

定義對象發生的事情:

  • 產生一個空的對象的名稱空間

  • 會自動觸發 __init__

  • 把對象自己以及括號內的參數一併傳給 __init__ 函數

    總結:調用類會產生一個對象,調用類的過程叫作類的實例化,產生的對象稱之爲類的一個實例。

實例化一個對象:

# 定義一個類
class Cat:
    att = 'cute'

    def catch(self):
        print('catch mouse.')

    def climb(self):
        print('climb up a tree.')
        
# 實例化對象
cat1 = Cat()
cat2 = Cat()

# 查看對象屬性
print(cat1.att)
cat1.catch()
cat1.climb()
print(cat2.att)
cat2.catch()
cat2.climb()

運行結果:

cute
catch mouse.
climb up a tree.
cute
catch mouse.
climb up a tree.

Process finished with exit code 0

2.5.2 定製對象獨有的特徵

方法:類定義階段定製屬性,使用 __init__ 函數。

# 定義類
class Cat:
    def __init__(self, att, variety, age, weight):
        self.att = att
        self.varieties = variety
        self.age = age
        self.weight = weight

    def catch(self):
        print('catch mouse.')

    def climb(self):
        print('climb up a tree.')

# 實例化對象時傳特徵
cat1 = Cat('cute', 'Orange Cat', 3, 10)
cat2 = Cat('lovey', 'Dragen-Li', 2, 6)

print(cat1.att, cat1.varieties, cat1.age, cat1.weight)
print(cat2.att, cat2.varieties, cat2.age, cat2.weight)

運行結果:

cute Orange Cat 3 10
lovey Dragen-Li 2 6

Process finished with exit code 0

3. 對象與類的查找順序

對象與類的查找順序:

  1. 對象的屬性,若對象自己有,則查找對象本身具備的屬性。
  2. 若對象自己不具有該屬性,則去類裏面找,若類也沒有,則報錯。

4. 對象的綁定方法

4.1 對象的綁定方法

class Cat:
    def __init__(self, name, att, variety, age, weight):
        self.name = name
        self.att = att
        self.varieties = variety
        self.age = age
        self.weight = weight

    def catch(self):
        print(f'{self.name}catch mouse.')

    def climb(self):
        print('climb up a tree.')
  • 類名稱空間中定義的數據屬性和函數屬性都是共享給全部對象用的
  • 對象名稱空間中定義的只有數據屬性,並且是對象所獨有的數據屬性

4.2 類使用對象的綁定對象

cat1 = Cat('lucky', 'cute', 'Orange Cat', 3, 10)
cat2 = Cat('ball', 'lovey', 'Dragen-Li', 2, 6)

print(cat1.name)
print(cat2.name)

運行結果:

lucky
ball

Process finished with exit code 0
  • 類中定義的函數是類的函數屬性,類可使用,但使用的就是一個普通的函數而已,意味着須要徹底遵循函數的參數規則,該傳幾個值就傳幾個

4.3 對象使用對象的綁定方法

print(id(cat1.climb))
print(id(cat2.climb))
print(id(Cat.catch))

cat1.catch()
cat2.catch()

運行結果:

1503122635976
1503122635976
1501259299696

lucky catch mouse.
ball catch mouse.

Process finished with exit code 0
  • 類中定義的函數是共享給全部對象的,對象也可使用,並且是綁定給對象用的,
  • 綁定的效果:綁定給誰,就應該由誰來調用,誰來調用就會將誰看成第一個參數自動傳入
相關文章
相關標籤/搜索