本文章的思路是:
介紹面向物件概念,世界萬物皆物件
類的定義
類中屬性、方法的新增
物件的建立
屬性和方法的呼叫
物件屬性的新增
方法間呼叫
引言
在介紹面向物件前,我們首先理解下什麼是面向物件。舉一個大家都很熟悉的例子,大象放到冰箱需要幾步?
我們第一想法可能是,大象能放到冰箱嗎?其實這不重要問的是步驟。
那這三個步驟跟我們程式設計有關係嗎?有關係!
因為我們所有的程式設計都是按照人的思維方式來實現的。但是上面更加強調的是
步驟
而不是
面向物件
,
所以是面向過程
。
面向過程更加註重步驟,如果某個步驟實現遇到問題,程式可能就不能繼續。
在面向物件的世界裡不會首先關注過程、步驟,就是你怎麼放進去的。而是關注物件。
在這個過程中涉及幾個物件,其中
大象和冰箱
就是這個題目中的物件。
大象有很多品種,是所有的大象都是這麼做嗎?題目中說的並不是某一個種類的大象,而是大象這類,所以無論你是什麼大象最後都是關進冰箱。
冰箱也有很多的型號,顏色,大小,品牌 啊等,是指所有的冰箱嗎?當然冰箱指的是所有冰箱的統稱,也是一類——-冰箱類
所以,世界萬物皆物件!!
面向物件的類
類就是一個群體,這個群體是所有的統稱。比如人類,無論你是中國人、美國人、韓國人還是日本人,這些都叫人類。
再比如說:汽車類,指的也是一個群體,勞斯萊斯、賓士、奧迪、寶馬、比亞迪、大眾等等就是車這一類。
朋友們!你們想想生活中還有哪些類呢?
手機類、電腦類、水杯類、植物類、學生類、老師類、水果類、蔬菜類、房子類、醫生類、演員類……
大家發現這些類跟我們生活息息相關,就是將生活中的人與人、人與物的溝通在電腦上體現出來,比如我們常用的購物網站
點開一個購物網站就可以,順著選單點開任意一個類別,比如如果你點選了手機類,所有手機的資訊都出來了。
如果讓你定義一個手機類,你會如何實現呢?
我們必須按照這個格式:
class 類名:
屬性
方法
class是關鍵字,類名根據需求自己起名
,比如電腦類就是:Computer,手機類就是:Phone等
重點強調一下格式
注意:
類名的首字母要求大些,不要使用中文。
類名後面是有冒號的
類體像函式體一樣需要縮排的
class Phone:
pass # pass也是關鍵字,表示佔位符。一個完整的類裡面是有東西的,否則結構就“坍塌”即有
這就是一個手機類。但是這個手機類少了些東西。第一手機的特徵要描述出來,其次手機能做什麼也沒有。這不算一個完整的類。
一個完整的類結構是需要有:用來表示特徵的屬性和表示動作的方法。
手機有什麼特徵呢?品牌、顏色、型號、價格、螢幕大小。。。 我們要在類中描述出來。
class Phone:
# 當然屬性也可以不賦值,比如是None或者0,這裡的是類屬性
brand = ‘華為’
color = ‘黑色’
type = ‘Mate30’
price = 3999
但是手機的功能還沒有體現出來,手機能做什麼能打電話、發信息、。。。,所以還要新增方法,方法即動作。方法定義同我們函式的定義,但是也有不同。
【注意方法的引數位置的self】
class Phone:
# 當然屬性也可以不賦值,比如是None或者0
brand = ‘華為’
color = ‘黑色’
type = ‘Mate30’
price = 3999
def call(self):
print(‘可以打電話!’)
def send_message(self):
print(‘可以發信息!’)
好了!一個類的完整結構就完成了。我們再來定義一個類,比如賽亞人類:
class Saiya:
name = ‘悟空’
hair = ‘固定’
has_tail = True
appetite = ‘大’
def fight(self):
print(‘我們賽亞人就是喜歡戰爭!’)
但是類定義了怎麼用呢?
前面我們提到過,
類是一個統稱
,
如果買手機你肯定不會說:我買手機,肯定是買手機類中的某一個手機。而這一個手機我們就稱作物件。
物件是具體的,類是抽象的。
這個類就好比一個模具,造月餅的模具,透過這個模具可以造出很多的月餅,而我們吃到的月餅就是物件。
物件的建立
建立物件的方式:
物件名 = 類名([引數,。。。])
故:
# 建立手機物件
phone1 = Phone()
phone2 = Phone()
phone3 = Phone()
# 三個不同的記憶體地址,所以建立一個物件就有一塊自己的記憶體地址
print(phone1)
print(phone2)
print(phone3)
如何檢視物件的屬性和呼叫物件的動作呢?
透過
物件名加點訪問
,這樣的格式。
物件名。屬性名
或者
物件名。方法名()
比如上面的手機物件呼叫
# 獲取屬性值
print(phone1。brand)
print(phone1。price)
#呼叫方法
phone1。call()
phone1。send_message(
再建立Saiya類物件,並呼叫一下方法
s1 = Saiya()
s2 = Saiya()
s3 = Saiya()
print(s1)
print(s2)
print(s3)
print(s1。has_tail)
s1。fight()
s2。fight()
# 觀察
print(s1。name)
print(s2。name)
print(s3。name)
怎麼打印出來的name都一樣呢?
物件屬性新增
如果不希望他們訪問類的屬性,物件新增屬性的方式有兩種:
物件動態新增
在建立物件的時候,__init__新增
第一種新增方式:
所謂物件動態新增就是在建立完物件之後,透過【物件。屬性名=新值】的方式賦值。
比如:手機類、賽亞人類(在原來程式碼基礎上講就行)
類的定義省略。。。。。使用原來的程式碼
# 建立手機物件
phone1 = Phone()
phone2 = Phone()
phone3 = Phone()
# 給phone1新增brand品牌,如果不設定獲取的就是類中屬性設定的品牌:華為
print(phone1。brand) # 先列印一下,然後修改,然後列印觀察變化
phone1。brand= ‘oppo’
phone1。price = 4999
print(phone1。brand)
# 同理是phone2,phone3也可以改變
同理賽亞人類也是如此
類的定義省略。。。。。使用原來的程式碼
s1 = Saiya()
s2 = Saiya()
s3 = Saiya()
# 改變s1的名字,可以互動一下,你們知道的龍珠中,是賽亞人的還有誰呢?
s1。name=‘貝吉塔’
print(s1。name)
s2。name = ‘巴達克’
print(s2。name)
第二種新增方式
利用魔術方法完成,最常用的用於實現屬性初始化的方法是;__init__
所謂魔術方法就是無需呼叫,在某種場景下會自動觸發的方法。其中 __init__就是,看一下他的使用
重新定義一個類比如我們熟悉的人類,
# 先不新增屬性,看一下__init__的使用
class Person:
country = ‘中國’
# 定義__init__方法
def __init__(self):
print(‘我是一個__init__方法’)
def eat(self):
print(‘我是吃貨,每天各種美食吃吃喝喝真美!’)
# 建立物件
p1 = Person() # 觀察結果 可以看到有內容打印出來
p2 = Person() # 觀察結果
print(p1)
print(p2)
可以看到建立物件就預設呼叫__init__,並沒有顯示的呼叫__init__。
在__init__中新增屬性,
此處注意講解self的作用,self表示物件自身,如何體現出來?在init中列印一下self物件觀察是否是與原物件地址一致
強調如果init有引數在建立物件的時候必須加引數
class Person:
country = ‘中國’
# 定義__init__方法
def __init__(self,name):
print(‘我是一個__init__方法’)
print(self)
self。name=name # 此時就相當於在self這個空間中存放了一個name屬性
def eat(self):
print(‘我是吃貨,每天各種美食吃吃喝喝真美!’)
p = Person() # 此時報錯,沒有引數 註釋掉
p = Person(‘龜仙人’)
print(p。name)
p1 = Person(‘布林瑪’)
print(p1。name)
# 大家可以看到物件呼叫name,名字不一樣了
# 此處列印的結果也是一樣的???????為什麼???呼叫的都是eat方法,如果加以區分如何實現?
p。eat()
p1。eat()
可以在eat中飲用name屬性,比如(修改Person的eat方法)
class Person:
country = ‘中國’
# 定義__init__方法
def __init__(self,name):
print(‘我是一個__init__方法’)
print(self)
self。name=name
# 此處再次強調self,self表示物件,誰呼叫eat此時的self就是誰
def eat(self):
print(self。name + ‘是吃貨,每天各種美食吃吃喝喝真美!’)
p = Person(‘龜仙人’)
p1 = Person(‘布林瑪’)
p。eat()
p1。eat()
此時列印的結果就不一樣了。
如果再加一個方法呢?在這個方法中我們介紹下帶引數的方法定義
class Person:
country = ‘中國’
# 定義__init__方法
def __init__(self,name):
print(‘我是一個__init__方法’)
print(self)
self。name=name
# 此處再次強調self,self表示物件,誰呼叫eat此時的self就是誰
def eat(self):
print(self。name + ‘是吃貨,每天各種美食吃吃喝喝真美!’)
# 當然方法中也可以有更多的語句
def sport(self,time):
if time<6:
print(self。name+‘你太勤快了,起這麼早去練功了啦!贊’)
else:
print(‘怎麼這麼愛偷懶呢?還不抓緊時間練功去!哼!’)
p = Person(‘悟空’)
p。eat()
p。sport(4)
p = Person(‘雅木茶’)
p。sport(9)
也可以在sport中呼叫eat的,即
def sport(self,time):
if time<6:
print(self。name+‘你太勤快了,起這麼早去練功了啦!贊’)
else:
print(‘怎麼這麼愛偷懶呢?還不抓緊時間練功去!哼!’)
# 比如練完功了,吃飯去,注意使用eat
self。eat()
最後總結:
面向物件類與物件的使用步驟:
提取特徵、動作,定義類
在類中定義__init__方法初始化屬性
在類中定義方法
根據類,建立物件
物件呼叫屬性或者方法