01 - 面向對象 - 面向對象舉例
所謂面向對象的編程語言,簡單理解就是語言中所有的操作都是 通過對象來完成的
面向過程就是將程序的邏輯分解成一個一個的步驟
通過對每個步驟的抽象來完成程序
‘’’
孩子喫西瓜
1.媽媽穿衣服穿鞋出門
2.媽媽騎電動車
3.媽媽到超市門口放好電動車
4.媽媽買西瓜
5.媽媽結賬
6.媽媽騎電動車回家
7.到家孩子喫西瓜
‘’’
這種方式編寫的代碼往往只適用於一個功能
媽媽給孩子買西瓜
面向對象的編程思維,將所有的功能統一保存到對象當中
比如媽媽的功能就保存到媽媽的這個對象當中,孩子的功能就保存到孩子的對象當中
你要使用某個功能,直接找到對應的對應的對象即可
這種方式編寫的代碼,比較容易閱讀,並且比較維護,容易複用
02 - 面向對象 - 類的簡介
1.目前我們所學習的一些對象例如(int,str,list,tuple,dict…)這些都是Python的內置對象
類, 簡單理解就是相當於一個圖紙,在程序中我沒玩你要跟根據類來創建對象
類就是對象的圖紙,我們也稱對象是類的實例(instance)
如果多個對象是通過一個類創建的,我們稱這些對象都是一類對象
像 int() float() bool() list()…這些都是類
a = 10
a = int(10) # 創建一個int類的實例 等價於 a = 10
b = str(‘hello’) # 創建一個str的實例
如果我們要自定義類使用大寫字母開頭 MyClass 谷歌 火狐 360
規矩 規則
print(a,type(a)) # 10 <class ‘int’>
print(b,type(b)) # hello <class ‘str’>
2.定義一個類
使用關鍵字class來定義
語法 class 類名([父類]):
代碼塊
class MyClass():
pass
print(MyClass) # <class '__main__.MyClass'>
mc = MyClass() # mc 就是通過MyClass創建的對象,mc是MyClass的實例
print(mc,type(mc)) # <__main__.MyClass object at 0x0000021E848F62E8> <class '__main__.MyClass'>
3. isinstance() 用來檢測一個對象是否是一個類的實例
class MyClass():
pass
mc_1 = MyClass()
mc_2 = MyClass()
mc_3 = MyClass()
mc_4 = MyClass()
# isinstance() 用來檢測一個對象是否是一個類的實例
result = isinstance(mc,MyClass) # result = isinstance(int,MyClass)
print(result) # print(result)
>>> >>>
True False
03 - 面向對象 - 對象的創建流程
類也是一個對象!!!
類就是一個用來創造 對象的對象
class MyClass():
pass
mc = MyClass()
mc_1 = MyClass()
mc_2 = MyClass()
mc_3 = MyClass()
mc_4 = MyClass()
# isinstance() 用來檢測一個對象是否是一個類的實例
result = isinstance(mc,MyClass)
print(id(MyClass),type(MyClass)) # 2105409013784 <class 'type'>
類是type類型的對象 定義類實際上就是定義了一個type類型的對象
a = 6
print(type(a)) # <class 'int'>
格式:
class MyClass():
pass
mc = MyClass()
1.創建了一個變量mc
2.在內存中就創建了一個新的對象
現在我們通過MyClass這個類創建的對象都是一個空的對象
也就是對象中實際上什麼都沒有,就是相當於 一個空的盒子
我們可以向對象中添加變量 對象中的變量稱之爲屬性
語法 對象.屬性名 = 屬性值
mc.name = ‘葫蘆娃’
mc_2.name = ‘鋼鐵俠’
print(mc_2.name) # 鋼鐵俠
使用類創建對象的流程:
創建一個變量mc
在內存中創建一個新的對象
04. 類的定義
類的定義:類和對象都對現實生活中內容的抽象
實際上所有的失誤都是有兩部分組成
1.數據(屬性)
2.行爲(方法)
嘗試定義一個人類
class person():
# 在類的代碼塊中,我們可以定義變量和函數
# 在類中我們所定義的變量,將會成爲所有實例的公共屬性
# 所有實例都可以放訪問這些變量
# a = 10
# b = 20
name = 'hlw'
# 在類中也可以定義函數,類中定義的函數,我們稱之爲方法
# 這些方法也可以通過該類的實例來訪問
def say_hello(a):
print('你好')
# pass
# 創建person的實例
p1 = person()
p2 = person()
# print(p1.a,p2.b)
# print(p1.name)
# print(p2.name)
# print(p1.name)
# 調用語法 對象.方法名
# 方法調用和函數調用的區別
# 如果是函數調用,函數有幾個形參,則調用函數的時候就要傳遞幾個實參
# 但是如果是方法調用,默認傳遞一個參數,所有方法中至少要定義一個形參
# 注意:方法調用時,第一個參數有解釋器自動傳遞,所以定義方法時,至少要定義一個形參
p1.say_hello()
# 加括號是調用某某,不加括號就只是個對象
程序1:
class person():
a = 10
b = 20
name = 'hlw'
pass
p1 = person()
p2 = person()
print(p1.a,p2.b)
print(p1.name)
print(p2.name)
>>>
10 20
hlw
hlw
程序二:
class person():
name = 'hlw'
def say_hello(b):
print('你好')
b = person()
b.say_hello()
05. 面向對象 - 屬性和方法
實例爲什麼能訪問到類中的屬性和方法呢?
類中定義的屬性和方法都是公共的,任何該類的實例都可以訪問
屬性和方法的查找流程
當我們調用一個對象的屬性時,解析器會先在當前對象中尋找是否含有該屬性
如果有,則直接返回當前對象的屬性值
如果沒有,則去當前對象的類對象中去尋找,如果有則返回類對象的屬性值
如果沒有則報錯
class person():
name = 'hlw'
p1 = person()
p2 = person()
# 修改p1的name屬性值
p1.name = 'gtx'
print(p1.name)
類對象和實例對象都可以保存屬性(方法)
如果這個屬性(方法)是所有實例共享的,則應該將其保存到類對象中
如果這個屬性(方法)是某個實例獨有的,則應該保存到實例對象中
在類中方法不能訪問類中的屬性
class person():
name = 'hlw'
def say_hello(self):
# 第一個參數就是調用方法的本身
# 如果是p1調用,則第一個參數就是p1對象
# 如果是p2調用,則第一個參數就是p2對象
print('你好!我是%s'%self.name)
p1 = person()
p2 = person()
p1.name = '葫蘆娃'
p2.name = '鋼鐵俠'
p1.say_hello() # 你好, 我是葫蘆娃
p2.say_hello() # 你好, 我是鋼鐵俠
>>>
你好!我是葫蘆娃
你好!我是鋼鐵俠