python 基礎語法-物件導向
一、物件導向
1、物件導向概念
物件導向是一種程式設計思想,是對現實世界中的事物進行抽象的方式。應用到程式碼程式設計設計中,是一種建立實物模型的方式。
2、面向和麵向過程的區別
程式導向關注的是完成工作的步驟,物件導向關注的是誰能完成工作。物件導向是在完成工作的時候關注哪些個體能夠完成對應的工作,找到對應的個體即可完成對應任務。
二、類
1、類的概念
類是一系列事物的統稱,同類事物必定具有的特徵。日常事物的特徵根據特性分為狀態和行為,對應到類中就是變數和方法。
特徵分類: 狀態
變數 -->(成員變數)
行為 --> 方法(成員方法)
統稱:類的成員
複製程式碼
2、類定義語法格式
class 類名:
pass
複製程式碼
class Cat:
pass
複製程式碼
3、類名的命名規範
類名命名規範:滿足大駝峰命名規範。
三、物件
1、物件的概念
物件是類的具體表現形式,是實際存在的個體。(類是一系列事物的統稱)
2、建立物件的語法格式
物件名 = 類名()
複製程式碼
class Cat: # 建立了一個類
pass
cat1 = Cat() # 建立了一個物件
複製程式碼
四、成員變數
1、成員變數的概念
成員變數用於描述物件的固有狀態或屬性。
2、定義成員變數語法格式(共有屬性/共有變數)
class 類名:
def __init__(self):
self.變數名1 = 值1
self.變數名2 = None
複製程式碼
class Dog:
def __init__(self):
"""定義在 __init__ 裡面的是共有變數"""
self.type = "牧羊犬"
self.name = None
複製程式碼
3、成員變數定義語法格式(獨有屬性/私有屬性)
物件名.變數名 = 值
複製程式碼
class Dog:
def __init__(self):
self.type = "牧羊犬"
self.name = None
dog1 = Dog()
dog1.name = "tom"
dog1.colth = "red" # 物件建立了一個自己的獨有變數
複製程式碼
4、共有變數與獨有變數的區別
- 公有變數在__init__方法中宣告,每個物件都具有該變數
- 獨有變數在建立物件後宣告,只有當前物件具有此變數
- 定義物件的獨有變數時,如果獨有變數名與公有變數名相同,視為修改公有變數的值;如果獨有變數名與公有變數名不相同,視為定義新的獨有屬性
- None含義是為空,表示沒有具體的資料
5、變數的呼叫格式
取值:物件名.變數名
賦值:物件名.變數名 = 值
五、成員方法
1、成員方法概念
成員方法用於描述物件的固有行為。
2、定義成員方法語法格式
格式一(無參方法):
class 類名:
def 方法名(self):
方法體
複製程式碼
class Dog:
def __init__(self):
self.type = "牧羊犬"
self.name = None
def eat(self): # 成員方法
print("狗吃骨頭")
複製程式碼
格式二(有參方法):
class 類名:
def 方法名(self,形參1,形參2,…):
方法體
複製程式碼
class Dog:
def __init__(self):
self.type = "牧羊犬"
self.name = None
def eat(self):
print("狗吃骨頭")
def run(self,meter): # 成員方法帶參 meter
print("狗會跑步,跑了%d米"% meter)
複製程式碼
3、呼叫成員方法語法格式
格式一(呼叫無參方法):
物件名.方法名()
格式二(呼叫有參方法):
物件名.方法名(實參1,實參2,…)
class Dog:
def __init__(self):
self.type = "牧羊犬"
self.name = None
def eat(self):
print("狗吃骨頭")
def run(self,meter): # 成員方法帶參 meter
print("狗會跑步,跑了%d米"% meter)
dog1 = Dog()
dog1.eat() # 無參呼叫方法
dog1.run(340) # 有參呼叫方法
複製程式碼
六、__init __ 方法
1、__ init__ 方法的作用
- __init__方法,也稱為構造方法,建立物件時為物件初始化成員變數
2、定義__init__ 方法格式
格式一:
def __init__(self):
self.變數名1 = 值1
複製程式碼
class Dog:
def __init__(self):
self.type = "牧羊犬"
self.name = None
複製程式碼
格式二:
def __init__(self,形參1,形參2,…):
self.__屬性名1 = 形參1
self.__屬性名2 = 形參2
複製程式碼
class Dog:
def __init__(self,name):
self.type = "牧羊犬"
self.name = name
複製程式碼
3、__init __ 方法的呼叫和執行
__init__方法在建立物件時被執行,無需手工呼叫即可執行。
__init__方法中如果有形參,在建立物件時需要傳遞對應的實參。
4、魔術方法
魔術方法是在類中宣告、定義的方法,執行時無需手工呼叫,自動執行。
七、__ str__ 方法
1、__ str__ 方法的作用
__str__方法是在使用print函式列印輸出物件到螢幕時被呼叫的方法,用於返回物件的規範化字串表現形式.
2、定義__str__ 方法的語法格式
def __str__(self):
return 列印物件是顯示的資訊
複製程式碼
class Dog:
def __init__(self):
self.type = "牧羊犬"
self.name = None
def eat(self):
print("狗吃骨頭")
def run(self,meter):
print("狗會跑步,跑了%d米"% meter)
def __str__(self):
print("列印了一隻dog")
dog1 = Dog()
print(dog1) # 列印物件時呼叫 __str__ 函式
複製程式碼
八、成員方法呼叫類成員
1、成員方法中呼叫成員變數語法格式
self.變數名
複製程式碼
class Dog:
def __init__(self):
self.type = "牧羊犬"
self.name = None
def introduce(self):
print("我是一隻%s,我叫%s"% (self.type,self.name)) # 此處呼叫成員變數
dog1 = Dog()
dog1.name = "大黃"
dog1.introduce()
複製程式碼
2、成員方法中呼叫成員方法語法格式
self.方法名(實參1,實參2,…)
複製程式碼
class Dog:
def catch(self):
self.jump()
self.grasp()
self.bite()
def jump(self):
print("狗跳起來了")
def grasp(self):
print("狗抓住了兔子")
def bite(self):
print("狗咬死了兔子")
dog1 = Dog()
dog1.catch()
複製程式碼
3、self
self 僅出現在成員方法中,指代執行該方法的物件
九、封裝
1、封裝的作用
封裝操作可以對受訪問保護的成員進行功能開放的控制,達到保護資料不被非法訪問的目的。
2、定義私有變數的語法格式
self.__屬性名 = 值
複製程式碼
class Card:
def __init__(self):
self.card_id = None
self.__pwd = None
複製程式碼
3、定義私有方法語法格式
def __方法名(self,形參1,形參2,...):
方法體
複製程式碼
4、標準封裝語法格式
變數私有化格式:
self.__屬性名 = 值
複製程式碼
提供公共的訪問器格式:
def get_屬性名(self):
return self.__屬性名
複製程式碼
提供公共的修改器格式:
def set_屬性名(self,屬性名):
self.__屬性名 = 屬性名
複製程式碼
class Card:
def __init__(self):
self.card = None
self.__pwd = None
def __get_pwd(self):
"""可以用 __get 這個函式去訪問私有變數"""
return self.__pwd
def __set_pwd(self,pwd):
"""可以用 __set 這個函式去修改私有變數"""
self.__pwd = pwd
複製程式碼
十、類變數
1、類變數的概念
類變數是定義在類中,不屬於某個具體物件的特徵,被所有物件共同使用的特徵
2、定義類變數的語法格式
class 類名:
變數名 = 值
複製程式碼
3、呼叫類變數的語法格式
賦值格式:
類名.類變數名 = 值
複製程式碼
取值格式:
類名.類變數名(推薦)
物件名.類變數名(不推薦)
複製程式碼
4、注意事項
- 類變數推薦使用類名取值訪問,也可以使用物件名取值訪問
- 類變數只能通過類名修改;使用物件名呼叫類變數修改類變數的值時會建立新的物件獨有變數;如果此時物件具有同名物件變數,則修改對應的變數值
- 類變數可以私有化
十一、類方法
1、類方法的概念
類方法是定義在類中,不屬於某個具體物件的行為,被所有物件共同使用的行為
2、定義類方法的基本語法
class 類名:
@classmethod
def 方法名(cls,形參1,形參2,…):
方法體
複製程式碼
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
@classmethod
# 定義一個類方法
def eat(cls,foods):
print("這個%s真好吃"% foods)
複製程式碼
3、呼叫類方法語法格式
類名.類方法名(實參1,實參2,…) (推薦)
物件名.類方法名(實參1,實參2,…) (不推薦)
複製程式碼
4、注意事項
- 類方法中不允許使用例項變數和例項方法
- 類方法中允許使用類變數和類方法,通過第一個引數cls進行
- 例項方法中允許使用類變數和類方法
十二、靜態方法
1、定義靜態方法語法格式
class 類名:
@staticmethod
def 方法名(形參1,形參2,…):
方法體
複製程式碼
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
@statimethod
def show():
print("今天是一個好日子")
複製程式碼
2、呼叫靜態方法語法格式
類名.靜態方法名(實參1,實參2,…) (推薦)
物件名.靜態方法名(實參1,實參2,…) (不推薦)
複製程式碼
3、各種方法定義規則
- 只訪問成員變數的方法,定義成例項方法
- 只訪問類變數的方法,定義類方法
- 既訪問成員變數,也訪問類變數的方法,定義成例項方法
- 既不訪問成員變數,也不訪問類變數,定義成靜態方法
案例:手機
"""
演示手機案例
要求:
手機電量預設是100
打遊戲每次消耗電量10
聽歌每次消耗電量5
打電話每次消耗電量4
接電話每次消耗電量3
充電可以為手機補充電量
"""
# 程式分析:
# 1、需要定義一個類
# 2、需要定義一個變數用來記錄,手機電池電量的變化.
# 3、需要定義5個行為來描述充電和耗電的操作
#
# 首先定義一個類,類名為 phone。
class Phone:
def __init__(self):
self.power = 100
self.type = None
# project = a num = b
def use_power(self, project, num):
if self.power >= num:
self.power -= num
print("%s手機當前正在%s,手機電量減少%d%%,當前手機剩餘電量為%d%%" % (self.type, project, num, self.power))
else:
print("%s手機當前電量過低,僅剩餘%d%%無法完成%s,請充電後再進行操作" % (self.type, self.power, project))
def game(self):
self.use_power("打遊戲",10)
def music(self):
self.use_power("聽音樂", 5)
def call(self):
self.use_power("打電話", 4)
def answer(self):
self.use_power("接電話", 3)
def electricize(self,num):
"""定義一個充電行為,num 用於接受一次充電的電量"""
self.power += num
if self.power >= 100:
print("%s手機當前電量已經充滿,"% self.type)
self.power = 100
else:
print("已經對%s手機充電%d%%,當前手機電量為:%d%%"% (self.type,num,self.power))
def __str__(self):
return "%s手機,當前的手機電量為:%d%%" % (self.type,self.power)
# 建立一部手機,huawei,對他進行操作
huawei = Phone()
huawei.type = "華為"
huawei.game()
huawei.call()
huawei.call()
huawei.call()
huawei.call()
huawei.call()
huawei.call()
huawei.electricize(20)
print(huawei)
lianxiang = Phone()
lianxiang.type = "聯想"
lianxiang.game()
lianxiang.game()
lianxiang.game()
lianxiang.game()
lianxiang.game()
lianxiang.game()
lianxiang.game()
lianxiang.game()
lianxiang.game()
lianxiang.game()
lianxiang.game()
lianxiang.game()
print(lianxiang)
lianxiang.electricize(80)
lianxiang.electricize(80)
print(lianxiang)
複製程式碼
執行結果:
華為手機當前正在打遊戲,手機電量減少10%,當前手機剩餘電量為90%
華為手機當前正在打電話,手機電量減少4%,當前手機剩餘電量為86%
華為手機當前正在打電話,手機電量減少4%,當前手機剩餘電量為82%
華為手機當前正在打電話,手機電量減少4%,當前手機剩餘電量為78%
華為手機當前正在打電話,手機電量減少4%,當前手機剩餘電量為74%
華為手機當前正在打電話,手機電量減少4%,當前手機剩餘電量為70%
華為手機當前正在打電話,手機電量減少4%,當前手機剩餘電量為66%
已經對華為手機充電20%,當前手機電量為:86%
華為手機,當前的手機電量為:86%
聯想手機當前正在打遊戲,手機電量減少10%,當前手機剩餘電量為90%
聯想手機當前正在打遊戲,手機電量減少10%,當前手機剩餘電量為80%
聯想手機當前正在打遊戲,手機電量減少10%,當前手機剩餘電量為70%
聯想手機當前正在打遊戲,手機電量減少10%,當前手機剩餘電量為60%
聯想手機當前正在打遊戲,手機電量減少10%,當前手機剩餘電量為50%
聯想手機當前正在打遊戲,手機電量減少10%,當前手機剩餘電量為40%
聯想手機當前正在打遊戲,手機電量減少10%,當前手機剩餘電量為30%
聯想手機當前正在打遊戲,手機電量減少10%,當前手機剩餘電量為20%
聯想手機當前正在打遊戲,手機電量減少10%,當前手機剩餘電量為10%
聯想手機當前正在打遊戲,手機電量減少10%,當前手機剩餘電量為0%
聯想手機當前電量過低,僅剩餘0%無法完成打遊戲,請充電後再進行操作
聯想手機當前電量過低,僅剩餘0%無法完成打遊戲,請充電後再進行操作
聯想手機,當前的手機電量為:0%
已經對聯想手機充電80%,當前手機電量為:80%
聯想手機當前電量已經充滿,
聯想手機,當前的手機電量為:100%
複製程式碼