8.8篓冲、8.9Day014和Day015.面對對象基礎(chǔ)

編程思想:面向過程編程叶沛;函數(shù)式編程硫眯;面向?qū)ο缶幊?/h4>

面向過程編程 -- 算法邏輯
函數(shù)式編程 -- 函數(shù)
面向?qū)ο缶幊?-- 類和對象
編程思想要逐漸往高級思想:面向?qū)ο缶幊趟枷朕D(zhuǎn)變

1.什么是類;什么是對象

類就是擁有相同屬性呵哨,相同功能的對象的集合(抽象的)
對象就是類的實例(具體的)

例:
英雄是類 蠻子就是對象赁濒;魚人也是對象
車是類 具體的某一輛車是一個對象

2.類的聲明 -- 確定類的屬性和功能是什么

1)語法
class 類名:
類的說明文檔
類的內(nèi)容

2)說明
class - 關(guān)鍵字
類名 - 要求:標識符;不能是關(guān)鍵字
規(guī)范:a.首字母大寫孟害,駝峰式命名
b.見名知義
c.不能使用系統(tǒng)提供的函數(shù)名或者類名
類的說明文檔 - 要求和函數(shù)說明文檔一樣
類的內(nèi)容 - 主要包含類的屬性和方法(方法就是聲明在類中的函數(shù))

class Person:
def eat(self, food):
print(food)

聲明對象

1)語法
對象 = 類()
p1 = Person() # p1中存儲的就是Person類的對象
p2 = Person() # 同一個類可以創(chuàng)建多個對象

1.對象方法

類中方法分為:對象方法拒炎、類方法和靜態(tài)方法

1)對象方法
a.怎么聲明 -- 直接聲明(聲明前不需要加裝飾器)在類中的函數(shù)就是對象方法
b.特點 -- 自帶self參數(shù);用對象調(diào)用對象方法的時候self不用傳參,系統(tǒng)會自動將當前對象傳給self
self可以做到誰調(diào)用就指向誰
c.怎么調(diào)用 -- 以'對象.對象方法()'的形式來調(diào)用 - 通過對象來調(diào)用對象方法

1.構(gòu)造函數(shù) - 函數(shù)名和類名一樣挨务,用來創(chuàng)建類的對象的函數(shù)

python中聲明類的時候击你,系統(tǒng)會自動為這個類創(chuàng)建一個構(gòu)造函數(shù),函數(shù)的作用是創(chuàng)建對象
構(gòu)造方法的執(zhí)行過程:a.在內(nèi)存中開辟空間創(chuàng)建對象 b.用創(chuàng)建好的對象去調(diào)用init方法
c.返回對象在內(nèi)存中的地址

# __init__方法
聲明在類中用來對對象進行初始化的方法:(當對象一創(chuàng)建出來谎柄,這個方法就會被自動調(diào)用)

注意:創(chuàng)建對象的時候過程方法需不需要傳參丁侄,需要傳幾個,看這個類的__init__方法

1.類中的屬性

屬性就是聲明在類中的變量
類中的屬性分為:字段和對象屬性

1)字段
怎么聲明 -- 聲明在類的里面函數(shù)的外面的變量就是字段
怎么使用 -- 通過類去使用(以'類.字段'的形式使用)
什么時候用 -- 屬性值不會因為對象不同而不同朝巫,這樣的屬性就聲明成類是字段

2)對象屬性:枰 !E场W炯!2诰省B洹!1涮印必逆!
怎么聲明 -- 以'self.屬性名=值'的形式聲明在init方法中
怎么使用 -- 通過對象去使用
什么時候用 -- 屬性的值可能會因為對象不同而不一樣,這樣的屬性就聲明成對象屬性

class Student:
    def __init__(self):
        # 這兒的name揽乱、age名眉、gender就是對象屬性
        self.name = 'jack'
        self.age = 19
        self.gender = 'nan'
        self.study_id = '001'


stu1 = Student()
stu1.age = 18
print(stu1.name, stu1.gender, stu1.age)


class Student:
    def __init__(self, name, study_id, gender='boy'):
        # 這兒的name、age凰棉、gender就是對象屬性
        self.name = name
        self.age = 19
        self.gender = gender
        self.study_id = study_id

stu2 = Student('lucy', '090')
print(stu2.study_id, stu2.age, stu2.gender, stu2.name)


# 聲明一個Dog類损拢,擁有屬性:名字;年齡撒犀;性別和類型
# 要求創(chuàng)建對象的時候名字福压、品種必須賦值掏秩,年齡和性別可以賦值也可以不賦值
# 擁有兩個對象方法,一個用來打印信息
# 一個交換的方法:以xxx汪汪汪的格式打印叫喚信息

class Dog:
    def __init__(self, name, breed, age=2, gender='boy'):
        self.name = name
        self.age = age
        self.gender = gender
        self.breed = breed

    def print_message(self):
        print(self.name, self.age, self.breed, self.gender)

dog1 = Dog('jack', '牧羊犬')

dog1.print_message()
# python中類的對象的對象屬性支持增刪改查


class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender


p1 = Person('jack', 18, 'boy')
p2 = Person('lucy', 20, 'girl')

1.查(獲取屬性的值)

方法一:對象.屬性
方法二:getattr(對象荆姆,屬性名:str)/getattr(對象蒙幻,屬性名:str,默認值)
方法三:對象.getattribute(屬性名)

print(p1.name)
print(getattr(p1, 'age'))
print(p1.__getattribute__('gender'))

增/改

方法一:對象.屬性 = 值 #屬性存在是修改胆筒,不存在是添加
方法二:setattr(對象邮破,屬性名,值)

p1.name = 'hua'
print(p1.name)
setattr(p1, 'gender', 'boy')
print(p1.gender)

方法一:del 對象.屬性
方法二:delattr(對象仆救,屬性名)

slots魔法

通過給slots字段賦值來約束當前類的對象有哪些對象屬性

1.什么是內(nèi)置類屬性

聲明類的時候系統(tǒng)自動添加的屬性(可能是字段也可能是對象屬性)

class Person:
num = 61

def __init__(self,name, gender, age):
    self.name = name
    self.age = age
    self.gender = gender

def eat(self,food):
    print('%s在吃%s' % (self.name, food))

定制當前類的對象的打印

1)重新str方法 --方法的返回值就是對應(yīng)的打印結(jié)果(類型必須是字符串)

2)重寫repr方法 -- 這個方法的返回值就是對應(yīng)的打印結(jié)果(類型必須是字符串)

p1 = Person('Jack', 'boy', 19)

1__name__

類的字段抒和;類名.name -- 獲取類的名字(字符串)
print(type(Person))
print(type(int))
print(Person.name)

2__doc__

類的字段;類.doc -- 獲取類的說明文檔

3__class__

對象屬性彤蔽;對象.class -- 獲取對象對應(yīng)的類
相當于:(type(對象))

4__dict__ --

對象屬性:對象.dict -- 將對象所有的屬性和對應(yīng)的值轉(zhuǎn)換成一個字典中的鍵值對(一個對象對應(yīng)一個字典)
類的字典:類.dict -- 將類轉(zhuǎn)換為一個字典摧莽,字典中的元素是類中所有的字段和對應(yīng)的值
'''
print(p1.dict)
print(Person.dict)

5__module__

類的字段:類.module -- 獲取當前類是在哪個模塊中聲明的(返回的是模塊的名字)

6__bases__

類的字段:類.bases -- 獲取當前類的父類(返回的是一個元組)
當我們需要在獲取屬性之前做點別的事情就需要給這個屬性添加getter
當需要給屬性賦值之前做別的事,就需要給這個屬性添加setter

給屬性添加getter

1.屬性命名時前面加'_'
2.在@property裝飾器的后面什么一個對象方法
1)將屬性去掉下劃線作為方法名
2)方法除了self以外不需要其他參數(shù)
3)函數(shù)的返回值就是獲取這個屬性的時候得到的值
3.在外面使用屬性的時候铆惑,通過’對象.不帶下劃線的屬性'去使用

7吨觥:獲取屬性值的時候,就會自動取調(diào)用getter對應(yīng)的函數(shù)

給屬性添加setter

屬性添加setter之前必須先添加getter
1.保證屬性名前有'_'
2.在@getter名.setter后面聲明對象方法
a.將屬性去掉下劃線作為方法名
b.需要一個self以外的參數(shù)
c.不需要返回值
3.在外部使用屬性的時候员魏,通過’對象.不帶下劃線的屬性'去使用

注意:當給屬性賦值的時候丑蛤,實質(zhì)是調(diào)用setter對應(yīng)的方法

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age


p1 = Person('tony', 13)
print(p1.name, p1.age)

練習(xí):寫一個矩形類

屬性:長、寬撕阎、面積受裹、周長

要求從生活的角度看這個矩形

class Rectangle:
    def __init__(self, length, wide):
        self._length = length
        self._wide = wide
        self.area = length*wide
        self.perimeter = 2*(length+wide)

    @property
    def length(self):
        return self._length

    @length.setter
    def length(self, value):
        if not (isinstance(value, int)) or isinstance(value, float):
            raise ValueError

        if value < 0:
            raise ValueError
        self._length = value

    @property
    def area(self):
        self._area = self._length*self._wide

類中的方法:對象方法、類方法和靜態(tài)方法

1.對象方法
1)怎么聲明:
2)怎么調(diào)用:
3)特點:
4)什么時候用:如果實現(xiàn)函數(shù)的功能需要用到對象屬性虏束,就使用對象方法

2.類方法
1)怎么聲明:聲明在@classmethon后面
2)怎么調(diào)用:用類調(diào)用'類.類方法()'
3)特點:有自帶的參數(shù)cls棉饶,表示當前類;這個參數(shù)在調(diào)用的時候不用傳參镇匀,系統(tǒng)會自動將當前類傳給它
cls:誰調(diào)用就指向誰照藻,(如果是對象指向的是對象對應(yīng)的類)
4)什么時候用:如果實現(xiàn)函數(shù)的功能不需要對象屬性,但需要類的字段汗侵,就使用類方法

3.靜態(tài)方法
1)怎么聲明:聲明在@staticmethon后面
2)怎么調(diào)用:通過類來調(diào)用'類.靜態(tài)方法()'
3)特點:沒有默認參數(shù)
4)什么時候用:實現(xiàn)函數(shù)的功能即不需要類也不需要對象幸缕,就使用靜態(tài)方法

繼承

繼承就是讓子類直接擁有父類的屬性和方法
子類 -- 繼承者
父類/超類 -- 被繼承者

怎么繼承

class 類名(父類1,父類2晰韵,发乔。。雪猪。)
說明文檔
類的內(nèi)容

說明:
() - 固定寫法栏尚,如果省略相當于(object)
聲明類的時候如果沒有寫父類,默認繼承object(object又叫基類)
父類 - 一個類的父類可以有多個只恨,但是一般情況下只有一個(支持多繼承)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末译仗,一起剝皮案震驚了整個濱河市抬虽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌古劲,老刑警劉巖斥赋,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異产艾,居然都是意外死亡,警方通過查閱死者的電腦和手機滑绒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門闷堡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疑故,你說我怎么就攤上這事杠览。” “怎么了纵势?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵踱阿,是天一觀的道長。 經(jīng)常有香客問我钦铁,道長软舌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任牛曹,我火速辦了婚禮佛点,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘黎比。我一直安慰自己超营,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布阅虫。 她就那樣靜靜地躺著演闭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颓帝。 梳的紋絲不亂的頭發(fā)上米碰,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音躲履,去河邊找鬼见间。 笑死,一個胖子當著我的面吹牛工猜,可吹牛的內(nèi)容都是我干的米诉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼篷帅,長吁一口氣:“原來是場噩夢啊……” “哼史侣!你這毒婦竟也來了拴泌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤惊橱,失蹤者是張志新(化名)和其女友劉穎蚪腐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體税朴,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡回季,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了正林。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泡一。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖觅廓,靈堂內(nèi)的尸體忽然破棺而出鼻忠,到底是詐尸還是另有隱情,我是刑警寧澤杈绸,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布帖蔓,位于F島的核電站,受9級特大地震影響瞳脓,放射性物質(zhì)發(fā)生泄漏塑娇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一篡殷、第九天 我趴在偏房一處隱蔽的房頂上張望钝吮。 院中可真熱鬧,春花似錦板辽、人聲如沸奇瘦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耳标。三九已至,卻和暖如春邑跪,著一層夾襖步出監(jiān)牢的瞬間次坡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工画畅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砸琅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓轴踱,卻偏偏與公主長得像症脂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容