## 什么是面向對象
之前我們學習了函數,通過函數將一些特定的邏輯封裝起來。這種將代碼組織起來的方式也叫過程式編程。我們今天學習的面向對象編程則將程序做了更高維度的封裝,用人類更容易理解的方式編程。
## 類&實例
中國道德經有一句話:*道生一,一生二,二生三,三生萬物*,講的是世間的萬物都是從特定的模板里生出來的。這個模板就是類,生出來的東西就是對象。
我們來看幾個案例:

寵物狗有很多種:泰迪、金毛、哈士奇 都屬于狗科動物。狗本身是一個模板(類)。狗作為一個**類**,擁有尾巴、腿、耳朵等身體**器官**;可以執行跑、叫等**動作**。泰迪、金毛、哈士奇 是從狗模板“生出來的”,因此它們也擁有這些屬性。泰迪、金毛、哈士奇 就是狗這個類的**實例**。

汽車也有很多種,公交車、轎車、越野車都屬于汽車。汽車本身是一個模板(類),汽車作為一**類**,擁有方向盤、發動機、車身、最大時速等**屬性**;可以執行發動、變方向、鳴笛等**方法**。公交車、轎車、越野是從汽車模板“生出來”的,因此,他們也擁有這些構造。公交車、轎車、越野車就是汽車這個類的**實例**。
看過上面這兩個例子,對什么是是類、什么是實例有沒有一個形象的了解呢?下面我們看看用python怎么表達類和實例吧。
## 在python里定義類
在python中定義一個類可以參照下面的語法:
~~~
class Dog:
pass #類代碼
~~~
我們用 class關鍵字定義一個類,注意類的名字用首字母大寫的單詞來組成,為什么要首字母大寫呢?我們下面會解釋。
## python里對類實例化
定義好類,接下來通過類來構建實例了。看代碼:
~~~
teddy = Dog()
print(teddy)
~~~
我們定義了一個變量`teddy`,Dog()方法就是定義一個類的實例。`print(teddy)`會輸出 `<__main__.Dog object at 0x1041019e8>`
我們把類的首字母大寫,就不會把類和實例搞亂了。
## 實例屬性
類在定義好后,會擁有一個__init__方法。這個方法是當依照這個類構建實例的時候被調用的,我們來看代碼:
~~~
class Dog:
def __init__(self):
# 尾巴、腿、耳朵
self.tail = 'small'
self.leg = 'long'
self.ear = 'stand'
teddy = Dog()
print(teddy.leg)
~~~
在__init__方法里,有一個self參數,這個參數用來表達實例本身。那里面的 `self.tail`、`self.leg` 就是實例屬性了。類的每個實例有自己的屬性。比如泰迪的尾巴是短的、耳朵是下垂的。而哈士奇的尾巴是長的,尾巴是立起來的。
## 方法
除了屬性外,類還有方法。我們來看代碼:
~~~
class Dog:
def __init__(self, name):
# 尾巴、腿、耳朵
self.tail = 'small'
self.leg = 'long'
self.ear = 'stand'
self.name = name
def call(self):
print("汪汪", self.name)
teddy = Dog('teddy')
husky = Dog('husky')
teddy.call()
husky.call()
~~~
`call` 函數是類的方法,每個實例都會有這個方法。方法定義中會有默認的self參數,用來代表實例自己。這個代碼還可以印證每個實例有自己的屬性。
## 類屬性
除了實例屬性外,還有類屬性。看代碼:
~~~
class Dog:
dogCount = 0
def __init__(self, name):
# 尾巴、腿、耳朵
self.tail = 'small'
self.leg = 'long'
self.ear = 'stand'
self.name = name
Dog.dogCount += 1
def call(self):
print("汪汪", self.name)
teddy = Dog('teddy')
teddy.call()
print(Dog.dogCount)
husky = Dog('husky')
husky.call()
print(Dog.dogCount)
~~~
dogCount 是Dog類的屬性,類屬性從屬于類。每次改版類屬性的值都會反映的所有的實例上。

這節課我們講了面向對象,面向對象是編程里很核心的概念。一定要能夠有清晰的理解,怎么樣,小朋友們掌握了嗎?
**阿達老師-孩子身邊的編程專家**
```
class Yingxiong():
def __init__(self):
self.zhanji = ''
self.xueliang = 2000
self.jineng = ''
def gongji(self):
print('平A')
yase = Yingxiong()
yase.xueliang = 4000
yase.gongji()
anqila = Yingxiong()
anqila.xueliang = 2000
```
- 課程介紹
- 搭建環境
- 什么是計算機
- 程序是怎么運行的
- 安裝python
- 項目實例-安裝IDE
- 變量和簡單數據類型
- 數據&變量
- 數字
- 字符串
- 布爾類型
- 項目實例
- 容器-列表
- 容器
- 列表
- 項目實例
- 容器-字典
- 定義字典
- 項目實例
- 數據類型總結
- 條件語句
- python條件語句
- 項目實例
- 循環語句
- for循環
- while循環
- 項目實例
- 函數
- 5.0函數定義
- 5.2函數實戰
- 6.文件系統
- 6.1 文件系統介紹&python查找文件
- 6.2 用python讀寫文件
- 7. python操作時間
- 8.面向對象
- 8.1 類和對象
- 8.2 繼承和重寫
- 8.3 面向對象項目實戰
- 9 GUI編程
- 9.1 GUI基礎
- 9.2 備忘清單GUI版
- 10.網絡
- 10.1 網絡的發展
- 10.2 python http
- 11.web開發
- 11.1 web基礎&HTML
- 11.2 CSS&JavaScript
- 11.3 網頁計算器
- 11.3 網站開發實戰-播客搭建
- 11.3 python-web
- 12. 項目實戰-數據處理
- 13. 項目實戰-AI入門
- 13.1 環境搭建
- 心得
- 13.2 Tensorflow的瓜怎么吃
- 14 pygame
- 14.1 pygame Helloworld
- 14.4 pygame 動畫基礎 Animation
- 從0開始學python第14.5節 pygame 加載圖片和聲音
- 從0開始學python第14.6節 pygame.sprite(上)
- 14.7 pygame.sprite模塊(下)
- 14.8 pygame射擊游戲(一)
- pygame射擊游戲(二)
- 14.8 pygame射擊游戲(三)
- 14.8 pygame射擊游戲(四)
- 14.8 pygame射擊游戲(五)