Python3面向物件-----------封裝
以下是我對Python3面向物件------封裝的理解,因為博主也是初學Python3,有很多東西都還停留在表層的理解,如果我的部落格有任何錯誤,請及時評論或者私信我,我會及時更改。也歡迎同樣學習Python的你願意關注我的部落格,我會把我每週的學習內容進行整理和上傳,方便大家溝通和交流學習經驗。
Python面向物件---------封裝
(1)面向物件:封裝 繼承 多型
什麼是面向物件?什麼是面向過程?兩者有什麼區別?
面向物件:注重的是設計,從設計的角度,從生活的角度設計程式碼,追求的是程式碼的擴充套件性和維護性
面向過程:注重的是結果,以結果的角度出發考慮問題,不關心中間的實現過程,
不管用什麼方法得到結果即可
(2)封裝
什麼是封裝?
比函式大一點的容器叫做類(class),類這個容器中可以放很多函式和變數,
把同一類的函式和變數放到一個類中去的過程叫做封裝。
類:比較抽象化,可以比作一張圖紙或者一個模板,看不見
物件:是根據類(圖紙)創建出的具體的物體
先有類,後有物件
一個類可以建立無數個物件
物件與物件之間屬相不一定一致。
類是描述一類事物的,事物由屬性和行為構成
屬性:這類事物的資訊(姓名,年齡,顏色,身高等) 用變量表示
行為:會做的的事 用函式表示
所以說類也可以說是由函式和變數組成的
當類中沒有變數時,通過物件名,Python是可以自動創建出變數,
但是這個變數只能自己用。(不推薦這種方式)
怎麼寫一個類和類中的建構函式?
1.建立變數
2.初始化賦值
class Person:
# 寫建構函式 init(初始化)
# self.變數名----建立變數
# self--自己(誰呼叫self就代表誰)
# Person()---建構函式
def __init__(self):
self.name = None
self.age = None
self.sex = None
print('我出生了!')
#普通函式
def eat(self):
name = '李四'
print(name,'吃飯')
#建立物件(例項化物件)
#建立物件預設呼叫建構函式
p1 = Person()
p1.name = '張三'
p1.age = 22
p1.sex = '男'
print(p1.name,p1.sex,p1.age)
p1.eat()
下邊看一個案例:
案例要求:有一個牌庫,發牌後左右手各13張牌,實現左右手換牌。(初學簡單實現即可)
案例分析:類:人 牌 手
人:屬性:左手,右手 行為:換牌
牌:屬性:花色,數字 行為:無
手:屬性:左手的牌 右手的牌 行為:無
#因為發牌是隨機的,所以先匯入random函式,接著根據分析分別建立類
import random
#牌類
class Card:
def __init__(self):
self.card_number=None
self.card_color=None
#手類
class Hand:
def __init__(self):
self.card=None
#人類
class Person:
def __init__(self):
self.left_hand_card=None
self.right_hand_card=None
def changeCard(self):
c=self.left_hand_card
self.left_hand_card=self.right_hand_card
self.right_hand_card=c
#牌庫(模擬隨機發13張牌)
PK = Card()
PK.card_color = ['♡','♣','♤','♢']
PK.card_number = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']
r,l = Hand(),Hand()
l.card,r.card = '',''
for i in range(13):
pai1 = random.choice(PK.card_color) + random.choice(PK.card_number) + ' '
pai2 = random.choice(PK.card_color) + random.choice(PK.card_number) + ' '
l.card += pai1
r.card += pai2
p=Person()
p.left_hand_card,p.right_hand_card = l,r
print('換前')
print('左手:{},右手:{}'.format(p.left_hand_card.card,p.right_hand_card.card))
p.changeCard()
print('換後')
print('左手:{},右手:{}'.format(p.left_hand_card.card,p.right_hand_card.card))
根據這個案例,我們應該大致瞭解了Python3中封裝的基本含義和封裝的方法,其中封裝的關鍵字class建立類的時候後邊不加括號,下邊建立物件呼叫類時用需要寫括號,封裝的意思就是把一個功能打包在一起,從而讓相同功能形成一個程式碼塊,在後期的維護和擴充套件上會節省很多的時間,因為你只需把相應功能的程式碼塊(類)進行修改而不像面向過程那樣牽一髮而動全身了。
補充知識:1.建構函式加引數
我們知道在將一個功能寫成一個函式時,為了方便和節省程式碼,我們可以給函式定幾個形參,利用引數傳遞的方式來減少程式碼量,那麼建構函式能不能加引數呢? 當然是可以的,那麼構造引數如何加引數呢?看下面的例子:
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
print('%s的年齡為:%d'%(name,age))
p=Person('張三',22)
執行結果證明'張三'和年齡完成了傳遞,所以,建構函式加引數的格式為:def __init__(self,形參)。實參寫在下邊物件呼叫類的括號裡邊,可以同時傳遞多個引數,注意構造引數內的self不可省略,其餘形參一次往後邊寫,用逗號隔開。