python 基礎語法之物件導向

python小胡發表於2018-12-15

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%
複製程式碼

相關文章