1. 程式人生 > >python - 面向物件 類的概念

python - 面向物件 類的概念

java c++ python(都是面向物件的語言, c是面向過程的語言)
面向過程:1—>2
—>3—>4 怎麼做
面向物件:4 誰來做
相對於函式來說是一個更大的封裝,根據職責將物件所能實現的功能封裝到一起
1.確定物件要做的事情(方法->多個)
2.讓物件呼叫方法

植物大戰殭屍
物件:向日葵   豌豆射手      殭屍
屬性:生命值    生命值       生命值
方法:生產陽光()  發射子彈()  移動()
     搖搖晃晃()             咬()

類:是一群具有相同特徵和行為事物的一個統稱(抽象的–>不能直接使用)
特徵:被稱為屬性
行為:被稱為方法

物件:由類創建出來的一個具體的存在,由哪一個類創建出來的
物件,就擁有哪一個類中定義的方法和屬性

先有類–>再有物件

類和物件的關係:
類是模板,物件是根據這個模板創建出來的,先有類再有物件
類只需要有一個,物件可以有很多個
不同物件(由同一類創建出來的物件)之間的屬性可以不相同
類中定義了什麼屬性和方法,使用這個類創建出來的物件就有什麼
屬性和方法,不可能多也不可能少

類的設計
    1.類名:這類事物的名字(大駝峰命名法)
        大駝峰命名法
            1.每一個單詞的首字母大寫
            2.單詞與單詞之間沒有下劃線
    2.屬性:這個類創建出來的物件有什麼樣的特徵
    3.方法:這個類創建出來的物件有什麼樣的行為

類名的確定
名詞提煉法分析整個業務流程,出現的名詞,通常就是找到的類

屬性和方法的確定
對 物件的特徵描述,通常可以定義成屬性
物件具有的行為(動詞),通常可以定義為方法
提示:需求中沒有涉及的屬性或方法在設計類時,不需要考慮

類、屬性、方法為了加以區分,舉幾個簡單的例子:
練習1:
需求:
小明今年18歲,身高1.75,每天早上要跑步,小明吃東西
小美今年17歲,身高1.65 小美不跑步,小美吃東西

類:Person
屬性:name age height
方法:run()
     eat()

練習2:
一隻黃顏色的狗狗叫大黃
看見生人旺旺叫
看見家人搖尾巴

類:Dog
屬性:color
     name

方法:shake shout

分清了類、屬性、方法後運用到具體程式設計裡:
題目:貓愛吃魚,貓要喝水

# 哪一個物件呼叫的方法,self就是哪一個物件的引用(面試常考)
# 在類封裝方法的內部,self就表示當前呼叫方法的物件自己
# 在的方法內部 可以通過 self.屬性 來訪問物件的屬性

class Cat:
    def eat(self):
        print('貓愛吃魚')
    def drink(self):
        print('貓要喝水')

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

輸出:

<__main__.Cat object at 0x7f7231eef588>
貓愛吃魚
貓要喝水

class Cat:
    def eat(self):
        print('%s 愛吃魚' %(self.name))
    def drink(self):
    	print('貓要喝水')

# 建立貓物件
tom = Cat()
# 在類的外部 物件.屬性 可以給物件新增屬性
# 不推薦使用
# 物件包含哪些方法,應該封裝在類中
tom.name = 'Tom'
print(tom)
addr = id(tom)
print(addr)
# %x:列印格式為十六進位制
print('%x' %(addr))
# %d:列印格式為十進位制
print('%d' %(addr))
tom.eat()
tom.drink()

輸出:

<__main__.Cat object at 0x7fb8de2c35f8>
140431978149368
7fb8de2c35f8
140431978149368
Tom 愛吃魚
貓要喝水

# 可以再建立一個貓物件
lazy_cat = Cat()
lazy_cat.name = 'miaomiao'
print(lazy_cat)
lazy_cat.eat()
lazy_cat.drink()

lazy_cat2 =lazy_cat
print(lazy_cat2)

輸出:

<__main__.Cat object at 0x7fb8de2c3668>
miaomiao 愛吃魚
貓要喝水
<__main__.Cat object at 0x7fb8de2c3668>