第十四章:面向對象 - 類的簡介

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()    # 你好, 我是鋼鐵俠

>>>
你好!我是葫蘆娃
你好!我是鋼鐵俠
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章