Python學(xué)習(xí)總結(jié)【連載】(十二)

Python學(xué)習(xí)總結(jié)【連載】(十一坪圾,十二)

2018.06.27 Juttachen


概述

+ 37 類的定義

+ 38 對象屬性和init方法

+ 39 self

+ 40 屬性的增刪改查

+ 41 內(nèi)置類屬性


三十七、類的定義

復(fù)習(xí)
類:具有形同屬性和功能的對象的集合兽泄;是抽象的
對象:類的實例;具體的

1.類的聲明

格式:

class 類名(父類):
屬性
方法

class 類名:
屬性
方法

a.class:python中聲明類的關(guān)鍵字
b.類名:標(biāo)識符胃珍。特殊規(guī)范:首字母大寫蜓陌,見名知意。
c.屬性:分類的字段和對象的字段 ----------->屬性
d.方法:分對象方法(構(gòu)造方法)填抬,類方法隧期,靜態(tài)函數(shù) ---------->功能

1)方法:就是聲明在類中的函數(shù)(都有一個默認(rèn)參數(shù),不需要調(diào)用的時候給他傳值)
2)對象方法:在類中直接聲明的函數(shù)仆潮,帶一個參數(shù)self,要使用對象來調(diào)用

    # 聲明類
    class Person:
        """人類""" # 類的說明文檔

        # 在類中聲明了eat方法,默認(rèn)有一個參數(shù)self檐晕,調(diào)用eat防范的時候蚌讼,不需要給delf傳參
        # 在類中直接聲明的函數(shù)都是對象方法,對象方法必須使用對象來調(diào)用

        def eat(self):
            print('吃飯')

        # 直接寫在類中的函數(shù)芥喇,必須帶參數(shù)self
        # def run()
        #   print('aaa')

    # 注意:如果要在類中聲明帶參才能的對象方法凰萨,那么其他的參數(shù)必須寫在self的后面
        def run(self,num):
            print('跑了%s米'%(num))

2. 創(chuàng)建對象

通過類名就可以創(chuàng)建對象,然后可以用變量存起來
可以通過對象去調(diào)用類中的對象方法武通,和使用類中聲明的對象屬性(字段)

    p1 = Person()
    # p1就是Person類的一個實例(對象)

調(diào)用對象方法珊搀,對象.方法()
寫在類里面的函數(shù)也可以傳參

    p1.eat()
    p1.run(100)

一個類可以創(chuàng)建多個對象

    p2 = Person()
    p2.eat(80)

三十八、對象屬性和init方法

實例一:init方法會自動被調(diào)用境析。
_ init _方法又叫構(gòu)造方法派诬。是在通過類創(chuàng)建對象的時候默赂,自動調(diào)用的方法括勺。
_ init _方法的作用就是在創(chuàng)建對象的時候初始化對象的屬性。
_ init _:對象的屬相就是聲明在整個方法中

    class Person:
        def __init__(self):
            # 在這個地方聲明對象的屬性朝刊。。冯挎。
            print('這個是init')

在聲明對象的時候會自動調(diào)用init方法

    p1 = Person()
    p2 = Person()

實例二:帶參的init方法
init的方法的方法名固定:init咙鞍。但是參數(shù)是可以隨意改變的(但是self參數(shù)不變)

    class Dog:
        def __init__(self,name):
            print('名字是:%s'%(name))

通過類創(chuàng)建對象的時候,要保證init方法里面的每一個參數(shù)都有值翰守。通過類后面的括號里傳參來保證每個參數(shù)都有值疲酌。

    dog1 = Dog('蔡蔡')

實例三:對象屬性
屬性:聲明在類中的變量
對象屬性:要通過對象去使用;不同的對象可能會有不同的值:

    class Person2:
        """人類"""
        # 在init方法中聲明對象的屬性:self.屬性名 = 初值
        def __init__(self):
            # 聲明一個對象屬性name:初始值為空串
            self.name = ''
            # 聲明一個對象屬性age:初始值為10

    # 通過Person2類創(chuàng)建對象1
    p1 = Person2
    # 通過對象去修改P1的name屬性
    p2 = Person2
    # p1.name = 'print(p2.name)

練習(xí):聲明一個學(xué)生類湿颅,擁有屬性:名字粥诫,年齡,電話怀浆。擁有方法:學(xué)習(xí)

    class Student:
        def __init__(self):
            self.name = ''
            self.age = 18
            self.tel = 12345678910

        def study(self):
            print('學(xué)習(xí)')

    stu = Student()
    stu.name = '韓梅梅'
    print(stu.name,stu.age,stu.tel)
    # 調(diào)用對象方法(給對象發(fā)送消息)
    stu.study()

實例四:創(chuàng)建對象的時候賦初值

    class Student2:
        def __init__(self,name1='',age1=1,tel1=''):
            self.name = name1
            self.age = age1
            self.tel = tel1

    # 在創(chuàng)建對象的時候給對象屬性賦初值
    stu2 = Student2('小明', 18,'112')
    print(stu2.name)
    stu3 = Student2(name1="小王")

三十九执赡、self

類中的對象方法都有一個默認(rèn)參數(shù)self:
1.調(diào)用帶有默認(rèn)參數(shù)self的方法,不需要給self傳參搀玖。系統(tǒng)會自動將調(diào)用當(dāng)前方法的對象傳給self
2.在方法中使用self就相當(dāng)于使用調(diào)用方法的對象(只能使用self,不能重新給self賦值)

    class Person:
        """人"""

        def __init__(self, name='', age=''):
            """聲明對象的屬性"""
            self.name = name
            self.age = age

        def eat(self):
            print('%s eat breakfirst.' % (self.name))

        # 聲明一個對象的方法run
        def run(self):
            print('self', self)
            print('run now!!')

            # 在對象方法中使用對象的屬性灌诅,直接用self去獲取屬性
            print('%s run now' % (self.name))
            self.eat()


    # 創(chuàng)建一個Person對象
    p1 = Person('小明', 10)

    # 通過對象p1去調(diào)用run方法,系統(tǒng)會將self = p1
    # 這個時候在run方法中猜拾,p1和self是同一個東西
    p1.run()
    print('p1', p1)
    # eat中的self = p1
    p1.eat()

    p2 = Person('小紅', 20)
    p2.run()
    p2.eat()

練習(xí):聲明一個圓類,擁有屬性:半徑 擁有方法:計算圓的面積顽聂,計算圓的周長

    import math
    # 或者 from math import pi(之后就不需要寫math.pi盯仪,而是直接寫pi)

    class Circle:
        def __init__(self, radius=10):
            self.r = radius

        # 在對象方法中可以通過self去使用對象
        def area(self):
            C = math.pi * self.r ** 2

        # 注意要 return C 或者直接 return math.pi * self.r ** 2

        def perimeter(self):
            l = 2 * math.pi * self.r
            return l
        # 同上道理
    c1 = Circle()
    print('%.2f' % c1.area())
    print('%.2' % c1.perimeter())

    c2 = Circle(3)
    print(c2.area())

四十、屬性的增刪改查

    class Dog:
        """狗狗"""
      def __init__(self,name = '',age = 0):
    self.name = name
    self.age = age
    dog1 = Dog('才才')

1.查

方法一:對象.屬性
特點:如果屬性村子就獲取屬性的值耀石。如果屬性不存在就會報錯爸黄。

    print(dog1.name)
    # print(dog1.score) # AttributeError: 'Dog' object has no attribute 'score'

方法二:getattr(對象,屬性名炕贵,默認(rèn)值) --> 獲取指定對象的指定屬性
如果不設(shè)置默認(rèn)值:屬性如果存在就獲取屬性的值称开,不存在就會報錯
如果設(shè)置默認(rèn)值:屬性如果存在就獲取屬性的值,不存在不僅不報錯鳖轰,而且將默認(rèn)值作為結(jié)果(但是不創(chuàng)建屬性)

  """
        getattr(object, name[, default]) -> value

        Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
        When a default argument is given, it is returned when the attribute doesn't
        exist; without it, an exception is raised in that case.
  """

    print(getattr(dog1,'name'))
    print(getattr(dog1,'score',100))
    # print(getattr(dog1,'color')) # AttributeError: 'Dog' object has no attribute 'color'
    # print(getattr(dog1,'score')) # AttributeError: 'Dog' object has no attribute 'score'

方法三:對象.getattribute(屬性名)
獲取指定對象的指定屬性脆霎。如果屬性不存在就會報錯。

    print(dog1.__getattribute__("name"))
    # print(dog1.__getattribute__("sex")) # 和方法一一樣報錯

2.改(修改)

方法一:對象.屬性 = 新值

    dog1.name = '大黃'
    print(dog1.name)

方式二:setattr(對象睛蛛,屬性名鹦马,新值)

    setattr(dog1,'name','小黃')
    print(dog1.name)

方式三:對象.setattr()

    dog1.__setattr__('name','小黑')

3.增(添加屬性)

python中可以動態(tài)的給對象添加屬性
方法一:
用對象.屬性 = 新值就可以增加(只要對象不存在)

    dog1.sex = '男'
    print(dog1.sex)

方式二:setattr(對象,不存在的屬性名忆肾,新值)

    setattr(dog1,'color','brown')
    print(dog1.color)

方式三:對象.setattr()

    dog1.__setattr__('score','100')
    print(dog1.score)

4.刪除屬性

方法一:del 對象.屬性
將dog1的age屬性刪除

  del dog1.age
  # print(dog1.age)  # AttributeError: 'Dog' object has no attribute 'age'

方法二:delattr(對象荸频,屬性名)

    delattr(dog1,'age')
    # print(dog.age)  # AttributeError: 'Dog' object has no attribute 'age'

方法三:對象.delattr(屬性名)

    dog1.__delattr__('age')
    # print(dog1.age) # AttributeError: 'Dog' object has no attribute 'age'

5.判斷對象是否擁有某個屬性

方式:hasattr(對象,'屬性名') ----> 判斷指定的對象是否擁有指定的屬性

    result = hasattr(dog1,'name')
    print(result)

補充:
實例1:對象屬性的操作只對當(dāng)前那一個對象有效

    class Person:
        def __init__(self,name = '',age = 0,id_num = '',sex = ''):
            """人"""
            self.name = name
            self.age = age
            self.id_num = id_num
            self.sex = sex

    p1 = Person('小明',10)

    # 給不存在的屬性賦值,就是添加屬性
    p1.score = 100
    print(p1.score+100)

    p2 = Person('羅昊',30)
    # print(p2.score) #AttributeError: 'Person' object has no attribute 'score'

注意:1.對對象屬性的增客冈,刪旭从,改,查是指定那一個對象。不會影響其他的對象和悦。
2.實際開發(fā)的時候退疫,一般只用獲取對象屬性的值和修改對象屬性的值。想添加或刪除屬性鸽素,一般都是在init方法中操作

實例二:

    class Dog:
        """狗"""
        #  通過給__slots__賦值褒繁,可以限制類中對象的屬性有哪些,防止一個不必要的屬性被添加
        __slots__ = ('name','age','color')
        def __init__(self,name='',age=0,color=''):
            self.name = name
            self.age = age
            self.color = color
            # self.sex = '男' # 在__slots__ 中沒有sex的話棒坏,不管在哪都不能添加,只能先在__slots__ 中添上才能添加

    dog1 = Dog('笑話',3,'Yellow')
    dog1.name1 = '大黃'

    del dog1.name
    # 注意__slots__ 中規(guī)定的屬性只能少不能多遭笋。刪除屬性是不受影響的坝冕。

四十一、內(nèi)置類屬性

    class Dog:
        """狗"""
        def __init__(self,name='',age=0,color=''):
            self.name = name
            self.age = age
            self.color = color

        def run(self):
            print('%s跑起來'%(self.name))

        def shout(self):
            print('%s在叫喚'%(self.name))
    
    dog = Dog()

內(nèi)置的類屬性是屬于類的瓦呼,需要通過類去使用

1. 類.name :獲取類的名字

    class_name = Dog.__name__ # 'Dog'
    print(class_name,type(class_name))
    # 這個屬性只有類有

2.類.doc:獲取類的說明文檔

    print(Dog.__doc__)

3.類.dict(對象.dict):獲取類中所有的類屬性(類字段)

    print(Dog.__dict__)
    print(dog.__dict__) #獲取了所有關(guān)于dog的屬性和值(以字典鍵值對的方式)【包括添加的】

4.類.module:獲取類所在的模塊的名字

    print(Dog.__module__)

5.類.bases :獲取指定類的基類

    print(Dog.__bases__)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喂窟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吵血,更是在濱河造成了極大的恐慌谎替,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹋辅,死亡現(xiàn)場離奇詭異钱贯,居然都是意外死亡,警方通過查閱死者的電腦和手機侦另,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門秩命,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人褒傅,你說我怎么就攤上這事弃锐。” “怎么了殿托?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵霹菊,是天一觀的道長。 經(jīng)常有香客問我支竹,道長旋廷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任礼搁,我火速辦了婚禮饶碘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馒吴。我一直安慰自己扎运,他們只是感情好瑟曲,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豪治,像睡著了一般洞拨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鬼吵,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天扣甲,我揣著相機與錄音篮赢,去河邊找鬼齿椅。 笑死,一個胖子當(dāng)著我的面吹牛启泣,可吹牛的內(nèi)容都是我干的涣脚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼寥茫,長吁一口氣:“原來是場噩夢啊……” “哼遣蚀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纱耻,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤芭梯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后弄喘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玖喘,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年蘑志,在試婚紗的時候發(fā)現(xiàn)自己被綠了累奈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡急但,死狀恐怖澎媒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情波桩,我是刑警寧澤戒努,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站镐躲,受9級特大地震影響储玫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匀油,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一缘缚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敌蚜,春花似錦桥滨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒲每。三九已至,卻和暖如春喻括,著一層夾襖步出監(jiān)牢的瞬間邀杏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工唬血, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留望蜡,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓拷恨,卻偏偏與公主長得像脖律,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腕侄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

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