2018-09-06-day14面向?qū)ο罂偨Y(jié)

編程方式
面向過(guò)程:以算法為工具
函數(shù)式編程:以函數(shù)為工具
面向?qū)ο缶幊?以類和對(duì)象為工具

1.類的聲明

類:對(duì)擁有相同功能和相同屬性的對(duì)象的集合
對(duì)象:類的實(shí)例
封裝效果:一個(gè)類中可以對(duì)多個(gè)功能進(jìn)行封裝(多個(gè)函數(shù))
類聲明格式:
class 類名(父類列表):
類的內(nèi)容

2.說(shuō)明:

class:聲明類的關(guān)鍵字
類名:標(biāo)識(shí)符此熬,不能是關(guān)鍵字模闲,駝峰式命名(第一個(gè)單詞首字母小寫,其他的單詞首字母大寫)首字母大寫<八搿!厚脉!央拖,見(jiàn)名知義
例如:Person、StudentSystem
(父類列表):這個(gè)部分可以省略垮卓,這個(gè)是繼承語(yǔ)法垫桂,可以有多繼承
冒號(hào):固定寫法
類的內(nèi)容:類的內(nèi)容包括類的方法和類的屬性

3.類中的方法:就是聲明在類中的函數(shù)

方法:
a.對(duì)象方法:對(duì)象方法需要通過(guò)對(duì)象來(lái)調(diào)用,對(duì)象.函數(shù)名()
直接寫在類中的方法粟按,自帶一個(gè)self參數(shù)

b.創(chuàng)建類的時(shí)候诬滩,系統(tǒng)會(huì)默認(rèn)給我們創(chuàng)建這個(gè)類對(duì)應(yīng)的構(gòu)造方法
構(gòu)造方法:類名()--->創(chuàng)建類對(duì)應(yīng)的對(duì)象霹粥,只有在調(diào)用構(gòu)造方法的時(shí)候才會(huì)產(chǎn)生新的對(duì)象
調(diào)用對(duì)象方法:對(duì)象.方法()
1).構(gòu)造方法:系統(tǒng)自動(dòng)創(chuàng)建的,方法名和類名一樣疼鸟,用來(lái)創(chuàng)建對(duì)象
2).init:init方法的功能是用來(lái)做初始化和添加對(duì)象屬性的
當(dāng)我們通過(guò)構(gòu)造方法去創(chuàng)建對(duì)象的時(shí)候后控,系統(tǒng)會(huì)自動(dòng)調(diào)用init方法

class Person:

    def __init__(self):
        print('初始化...')
    def eat(self):
        print('吃飯')

if __name__ =='__main__':
    p1=Person()     #創(chuàng)建Person類的對(duì)象,并且將對(duì)象的地址存到p1中
    p1.eat()        #調(diào)用對(duì)象方法

創(chuàng)建對(duì)象的過(guò)程:調(diào)用構(gòu)造方法在內(nèi)存中開辟一個(gè)對(duì)象空镜,然后用新建的這個(gè)對(duì)象去調(diào)用init方法
來(lái)初始化對(duì)象的屬性浩淘,最后才將對(duì)象返回


class Person:
    #init方法可以添加參數(shù)
    def __init__(self,name):
        print(name)

if __name__=='__main__':
    p1=Person('hello')

4 .類字段和類方法

類中的內(nèi)容:屬性和方法
1).屬性:
a.對(duì)象的屬性:不同的對(duì)象,對(duì)應(yīng)的值可能不一樣姑裂,這樣的屬性時(shí)對(duì)象屬性馋袜,屬于對(duì)象
b.類的字段:屬于類的,所有的對(duì)象對(duì)應(yīng)的值是一樣的
類中對(duì)象的屬性聲明再init方法中的舶斧,并且聲明格式是:self.屬性名 = 初值
***對(duì)象的屬性必須是全部傳入的

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def print_info(self):
        print(self.name,end='')
        print(self.age)
if __name__ == '__main__':
    s1=Student('張三',18)
    s1.print_info()

    s2=Student('李四',20)
    s2.print_info()

***對(duì)象的屬性時(shí)默認(rèn)的
class Student:
    def __init__(self):
        self.name = '張三'
        self.age = 18
        self.id = 1
    def print_info(self):
        print(self.name,self.age,self.id)

if __name__ == '__main__':
    s1 = Student()
    s1.print_info()
    s1.name = '李四'
    s1.age = 20
    s1.id = 2
    s1.print_info()

***對(duì)象的屬性部分傳入部分默認(rèn)

class Person:
    class_p ='white person'
    def __init__(self,id):
        self.name = '張三'
        self.age = '20'
        self.id = id
if __name__ == '__main__':
    p = Person(10)
    print(Person.class_p)
    print(p.class_p)

對(duì)象的屬性通過(guò)(對(duì)象.屬性)去使用對(duì)象的屬性欣鳖,也可以通過(guò)(對(duì)象.屬性)去修改對(duì)象的屬性

練習(xí):寫一個(gè)矩形類,擁有屬性長(zhǎng)和寬

class Rect:
    def __init__(self,width,height):

        self.height=height
        self.width=width


    def print_info(self):
        print(self.width,self.height)
if __name__ == '__main__':
    r = Rect(20,30)
    r2 = Rect(30,40)
    r.print_info()
    r2.print_info()

5.對(duì)象屬性的增刪改查

python是動(dòng)態(tài)語(yǔ)言茴厉,python中類的對(duì)象的屬性可以進(jìn)行增刪的的操作

class Person:
    def __init__(self):
        self.name ='張三'
        self.age = 18
        self.height = 160
if __name__=='__main__':
    p1 = Person()
    #查(獲取屬性的的值)
    '''
    方法一:對(duì)象.屬性名泽台,當(dāng)這個(gè)屬性名不存在的時(shí)候,會(huì)報(bào)AttributeError錯(cuò)誤
    '''
    print(p1.name)
    '''
    方法二:通過(guò)內(nèi)置函數(shù)getattr(object,name,default=None)
    object:指定對(duì)象
    name:屬性名字,字符串
    defalut:如果設(shè)置了默認(rèn)值矾缓,而要取的屬性不存在怀酷,會(huì)取回默認(rèn)值,程序不會(huì)崩潰嗜闻,
    如果沒(méi)有設(shè)置默認(rèn)值蜕依,要取的屬性不存在,會(huì)報(bào)錯(cuò)AttributeError
    '''
    print(getattr(p1,'name',0)) #0
    print(getattr(p1,'name'))   #Attribute
    '''
    方法三對(duì)象.__getattribute__(屬性名)
    屬性名:是一個(gè)字符串
    '''
    print(p1.__getattribute__('name'))

    #2.改(修改屬性的值)
    '''
    方法一:對(duì)象.屬性 = 新值
    方法二: def setattr(對(duì)象琉雳,屬性名样眠,新值)
    方法三:對(duì)象.__setattr__(屬性名,新值)
    '''
    p1.name = 'hello'
    print(p1.name)
    setattr(p1,'name','world')
    print(p1.name)
    p1.__setattr__('name','python')
    print(p1.name)
    
    '''
    3.增加(添加屬性)
    增加的語(yǔ)法和修改的語(yǔ)法一模一樣翠肘,屬性值存在就是修改檐束,屬性值不存在的時(shí)候就是添加
        方法一:對(duì)象.新屬性 = 初值
    方法二: def setattr(對(duì)象,新屬性名束倍,初值)
    方法三:對(duì)象.__setattr__(新屬性名被丧,初值)
    注意:添加屬性只能給某一個(gè)對(duì)象添加屬性
    p1.sex = '女'
    print(p1.sex)
    
    setattr(p1,'weight',45)
    print(p1.weight)

    p1.__setattr__('color','red')
    print(p1.color)

    類也可以以這樣的方式添加屬性
    '''

    '''
    4.刪除
    方法一:del 對(duì)象.屬性
    方法二:delattr(objject,屬性名)
        第一個(gè)參數(shù)是對(duì)象,第二個(gè)參數(shù)是屬性名
        delattr(p1,'age')
    方法三:對(duì)象.__delattr__(屬性名)
    注意:刪除只針對(duì)某一個(gè)單獨(dú)的對(duì)象
    '''
    del p1.name
    print(p1.name)
    delattr(p1,'age')
    print(p1.age)
    p1.__delattr__('name')
    print(p1.name)

6.對(duì)象方法

a.什么是對(duì)象方法:對(duì)象方法就是寫在類里面的方法默認(rèn)全部是對(duì)象方法绪妹,對(duì)象方法有一個(gè)默認(rèn)參數(shù)self
b.對(duì)象方法要通過(guò)對(duì)象來(lái)調(diào)用:對(duì)象.對(duì)象方法()
c.對(duì)象方法中默認(rèn)參數(shù)self甥桂,不需要傳參,因?yàn)樵谡{(diào)用這個(gè)方法的時(shí)候系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self邮旷,誰(shuí)調(diào)用self格嘁,self就是誰(shuí)

import math
class Circle:
    pi = math.pi
    def __init__(self,radius):
        self.radius = radius
    #聲明一個(gè)對(duì)象方法area
    #在這兒,self就是調(diào)用area方法的對(duì)象廊移,對(duì)象能做的事糕簿,self都可以做,相當(dāng)于java里的this.
    def area(self):
        print(id(self))
        return self.radius**2*Circle.pi

if __name__ == '__main__':
    c1 =Circle(10)
    print(id(c1))
    print(c1.area())

練習(xí)1:寫一個(gè)矩形類有屬性長(zhǎng)和寬狡孔,有兩個(gè)功能分別是求周長(zhǎng)和面積

class Rect:
    def __init__(self,length,width):
        self.length = length
        self.width = width
    #對(duì)象方法是否需要額外參數(shù)懂诗,看實(shí)現(xiàn)函數(shù)的功能需不需要除了對(duì)象屬性以外的其他的數(shù)據(jù)
    def perimeter(self):
        return (self.length+self.width)*2

    def area(self):
        return self.length*self.width

練習(xí)2:寫一個(gè)班級(jí)類,班級(jí)里面有多個(gè)學(xué)生的成績(jī)(一門)苗膝,可以獲取班級(jí)成績(jī)中的最高分

class Class:
    '''
    班級(jí)類
    '''
    def __init__(self,classname):
        self.scores = []
        self.classname = classname

    def get_high_score(self):
        if self.scores:
            return max(self.scores)
        return None

if __name__=='__main__':
    c1=Class('001')
    c1.scores=[10,20,5,25,76,1]
    print(c1.get_high_score())

d.類的字段
類的屬性叫類的字段
a.什么是類的字段:類的字段就是聲明在類中殃恒,函數(shù)的外面的變量,叫做類的字段

    class Person:
        #這個(gè)number就是類的字段
        number = 10
    if __name__ == '__main__':
        print(Person.number)

b.什么樣的屬性聲明成類的字段
不同的對(duì)象對(duì)應(yīng)的值都是一樣的辱揭,他是屬于所有對(duì)象公有的屬性离唐,是屬于類的。

c.怎么使用
通過(guò)類來(lái)使用:類.字段

練習(xí):寫一個(gè)類问窃,用一個(gè)屬性來(lái)保存這個(gè)類創(chuàng)建的對(duì)象的個(gè)數(shù)

class Person:
    count = 0
    def __init__(self):
        Person.count +=1

if __name__=='__main__':
    p1=Person()
    p1=Person()
    p1=Person()
    p1=Person()
    print(Person.count)

e.類的方法
類中的方法:
1.對(duì)象方法(實(shí)例方法)
直接聲明再類中亥鬓,自帶一個(gè)不需要主動(dòng)傳參的默認(rèn)參數(shù)self,誰(shuí)來(lái)調(diào)用指向誰(shuí)
調(diào)用:通過(guò)對(duì)象來(lái)調(diào)用
2.類方法
聲明方法前需要使用@classmethod說(shuō)明
特點(diǎn):自帶一個(gè)默認(rèn)參數(shù)cls,這個(gè)參數(shù)調(diào)用的時(shí)候不需要傳值,系統(tǒng)自動(dòng)給他傳域庇,誰(shuí)調(diào)用就指向誰(shuí)嵌戈,始終指向當(dāng)前類
調(diào)用:通過(guò)類來(lái)調(diào)用->類.類方法
cls:就是當(dāng)前類,可以創(chuàng)建對(duì)象听皿,調(diào)用類的屬性和方法
3.靜態(tài)方法
聲明方法前需要使用@staticmethod說(shuō)明
特點(diǎn):沒(méi)有默認(rèn)參數(shù),靜態(tài)方法不能在繼承中修改
調(diào)用:通過(guò)類來(lái)調(diào)用-->類.靜態(tài)方法()

類方法聲明格式

  Class Person:
        #聲明一個(gè)對(duì)象方法
        def object_func(self):
            print('對(duì)象方法')

        #聲明類方法
        @classmethod
        def class+func(cls):
            print('這是一個(gè)類方法')
        #聲明靜態(tài)方法
        @staticmethod()
        def static_func():
            print('這是一個(gè)靜態(tài)方法')

4.遇到問(wèn)題怎么來(lái)選擇使用哪種方法:
a.大前提:只要實(shí)現(xiàn)方法的功能需要用到對(duì)象的屬性熟呛,我們就使用對(duì)象方法
b.不使用對(duì)象方法的前提下,如果實(shí)現(xiàn)功能需要用到類的字段就使用類方法
c.實(shí)現(xiàn)功能既不需要對(duì)象的屬性尉姨,又不需要類的字段就使用靜態(tài)方法
注意:靜態(tài)方法和類方法劃分不用那么嚴(yán)格庵朝,靜態(tài)方法能做的類方法也可以做,反之亦然

class Person:
    #類的字段又厉,存儲(chǔ)人類的數(shù)量
    number = 100
    @classmethod
    def show_number(cls):
        print('人類的數(shù)量是:%d億'%cls.number)

    @staticmethod
    def show_number():
        print('人類的數(shù)量是:%d億'%Person.nmber)
Person.show_number()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末九府,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子馋没,更是在濱河造成了極大的恐慌昔逗,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篷朵,死亡現(xiàn)場(chǎng)離奇詭異勾怒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)声旺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門笔链,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人腮猖,你說(shuō)我怎么就攤上這事鉴扫。” “怎么了澈缺?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵坪创,是天一觀的道長(zhǎng)炕婶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)莱预,這世上最難降的妖魔是什么柠掂? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮依沮,結(jié)果婚禮上涯贞,老公的妹妹穿的比我還像新娘。我一直安慰自己危喉,他們只是感情好宋渔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辜限,像睡著了一般皇拣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上列粪,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天审磁,我揣著相機(jī)與錄音,去河邊找鬼岂座。 笑死态蒂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的费什。 我是一名探鬼主播钾恢,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鸳址!你這毒婦竟也來(lái)了瘩蚪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤稿黍,失蹤者是張志新(化名)和其女友劉穎疹瘦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巡球,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡言沐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酣栈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片险胰。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖矿筝,靈堂內(nèi)的尸體忽然破棺而出起便,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布榆综,位于F島的核電站妙痹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奖年。R本人自食惡果不足惜细诸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陋守。 院中可真熱鬧,春花似錦利赋、人聲如沸水评。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)中燥。三九已至,卻和暖如春塘偎,著一層夾襖步出監(jiān)牢的瞬間疗涉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工吟秩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咱扣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓涵防,卻偏偏與公主長(zhǎng)得像闹伪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壮池,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,103評(píng)論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,393評(píng)論 8 265
  • 感恩:1.媽媽為我準(zhǔn)備食物偏瓤、擦發(fā) 2.收入理財(cái)通獎(jiǎng)勵(lì)0.88元 3. 4. 5....
    lucky思齊閱讀 80評(píng)論 0 0
  • “所以,你到底想怎樣椰憋?厅克!”沅兒提劍指向琉璃珠中的皇后。 “我想怎樣橙依?呵证舟!你問(wèn)我想怎樣!我就是要你看看票编,你的...
    金媱閱讀 287評(píng)論 0 0
  • 艾拉枩枩枩閱讀 212評(píng)論 0 2