面向物件
面向物件編程介紹
面向物件編程:Object Oriented Programming,簡稱OOP,是一種程式設計思想,
需要注意的是,與之對應的是面向程序編程思想,實際上,能夠使用面向物件編程思想實作的程式,也都能通過面向程序完成,只是看哪種思想更適合當前開發需求,
面向程序與面向物件區別
面向程序:根據業務邏輯從上到下寫代碼
面向物件:將資料與函式系結到一起,進行封裝,減少重復代碼的重寫程序
類和物件
- 類:具有同一特征的事物,是抽象的,不是真實存在的,用來描述具有相同屬性和方法的物件的集合,
- 物件:某一個具體事物的存在,在現實世界中可以是看得見摸得著的,
注意:開發中,先有類,再有物件,
類的構成
類由3個部分構成
- 類的名稱:類名
- 類的屬性:一組資料
- 類的方法:允許對類進行操作的方法
注意:類名通常采用駝峰式命名方式,盡量讓字面意思體現出類的作用,
# 類的定義
class 類名稱:
類的屬性(成員變數)
類的行為(成員方法)
創建物件
python中,可以根據已經定義的類去創建出一個個物件
創建物件的格式為:
# 創建類物件的語法
物件 = 類名稱()
類與物件的使用
# 定義
class 類名:
def 方法名(self,引數): # 類中函式:稱為方法
pass
# 執行
s = 類名() # 創建物件(實體) 這個程序就是實體化
s.方法名(引數) # 呼叫類中方法
self引數
在類當中定義方法時,會發現系統幫我們自動創建了self引數,并且在呼叫物件的該方法時,也無需傳入self引數,
self的兩個概念:
- self本身是形參
- self就是當前物件本身
class Student:
def printinfo(self):
print(lisi.name, lisi.age)
print(self.name, self.age) # 這里會高亮,物件的屬性是暴露在外面的
print(lisi)
print(self)
lisi = Student() # 物件
# 物件的屬性是暴露在外面的
lisi.name = '李四'
lisi.age = 38
lisi.printinfo()
"""
李四 38
李四 38
<__main__.Student object at 0x000002E5A099B208>
<__main__.Student object at 0x000002E5A099B208>
說明在類中printinfo()方法中,lisi和self是等價的
"""
魔法方法
在Python的類中,以兩個下劃線開頭、兩個下劃線結尾的方法,如常見的 :__init__()、__str__()、__del__()等,就被稱為「魔術方法」(Magic methods),之所以會叫魔法方法原因是這些方法都是到達某個條件自動觸發,無需呼叫,如果希望根據自己的程式定制特殊功能的類,那么就需要對這些方法進行重寫,使用這些「魔法方法」,我們可以非常方便地給類添加特殊的功能,
__init__()
_init_() :初始化物件
class My_Phone():
def __init__(self):
self.width = 10
self.heigth = 15
def main(self):
print(self.width)
print(self.heigth)
apple = My_Phone()
_init_() ?法,在創建?個物件時默認被調?,不需要?動調?
_init_(self) 中的self引數,不需要開發者傳遞,python解釋器會?動把當前的物件引?傳遞過去,
- 帶引數的init
?個類可以創建多個物件,對不同的物件設定不同的初始化屬性,傳參即可,
class My_Phone():
def __init__(self,width,heigth):
self.width = width
self.heigth = heigth
def apple_phont(self):
print("蘋果手機的寬為:",self.width)
print("蘋果手機的高為:",self.heigth)
def huawei_phont(self):
print("華為手機的寬為:",self.width)
print("華為手機的高為:",self.heigth)
apple = My_Phone(10,20)
apple.apple_phont()
_str_()
當使?print輸出物件的時候,默認列印物件的記憶體地址,如果類定義了 str ?法,那么就會列印在這個?法中 return 的資料,
_str_():解釋類的屬性或作用
class Demo():
def __init__(self, width, heigth):
self.width = width
self.heigth = heigth
def __str__(self):
return f"你這個手機的寬是{self.width},高度是{self.heigth}"
a = Demo(10,20)
print(a) # 你這個手機的寬是10,高度是20
# 若沒有__str__()方法,則會列印物件的記憶體地址:<__main__.Demo object at 0x000001E6FC7A7198>
_del_()
當洗掉物件時,python解釋器也會默認調? __del__() ?法,在物件銷毀的時候被呼叫,當物件不再被使用時,del()方法運行:
class Demo():
def __init__(self, width, heigth):
self.width = width
self.heigth = heigth
def __del__(self):
print("物件已經洗掉")
a = Demo(10,20)
# __del__方法
class Demo:
def __del__(self): # 當由該類創建的實體物件,被洗掉或者說在記憶體中被釋放,將會自動觸發執行,
print("被釋放了!")
d = Demo()
print("*" * 20)
# del d # 相當于提前執行了del方法
print("*" * 20)
類屬性與方法
類的私有屬性
__private_attrs:兩個下劃線開頭,宣告該屬性為私有,不能在類的外部被使用或直接訪問
class Demo():
__num = 0 # 私有屬性
result = 0 # 公開屬性
def count(self):
self.__num += 1
self.result += 1
print(self.__num)
def getnum(self):
return self.__num
run = Demo()
run.count()
print(run.result)
# print(run.__num) # 報錯,實體不能訪問私有變數
__num = run.getnum()
print(__num)
類的私有方法
class func:
def fun1(self):
print("1")
def __fun2(self):
print("2")
def fun3(self):
return (self.__fun2())
f = func()
f.fun1()
# f.__fun2()
f.fun3()
# 強行呼叫類的私有方法
# 物件._類名__私有屬性
print(f._func__fun2) # 不建議使用
python中沒有真正意義上的私有
實體屬性
# 實體屬性
class Province:
def __init__(self, country, province):
self.country = country
self.province = province
def print_info(self):
print(self.country, self.province) # 通過self去訪問 這個要方便很多
print(zs.country, zs.province) # 通過每個物件去訪問
zs = Province("中國", "湖南")
zs.print_info()
ls = Province("中國", "湖北")
ls.print_info()
實體方法
class Demo:
def __init__(self):
self.name = "張三"
# 實體方法
def fun1(self):
print(self.name)
a = Demo()
a.fun1()
本文來自博客園,作者:大-鍋,轉載請注明原文鏈接:https://www.cnblogs.com/daguo118/p/17317557.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/550094.html
標籤:Python
上一篇:token驗證