Day15 類和對(duì)象

什么是類椿每,什么是對(duì)象

  1. 什么是類奕纫,什么是對(duì)象
    類就是擁有相同功能和相同屬性的對(duì)象的集合;類是抽象的

    對(duì)象就是類的實(shí)例;對(duì)象是具體的

    人是類, 郭銳就是人類的對(duì)象

  2. 類的聲明
    類中的內(nèi)容包含功能(函數(shù))和屬性(變量/屬性)

    • 語(yǔ)法
      class 類名:
      ? 類的內(nèi)容
    • 說(shuō)明
      class - python聲明類的關(guān)鍵字
      類名 - 要求:標(biāo)識(shí)符疾嗅、不能是關(guān)鍵字
      ? 規(guī)范:駝峰式命名 黍衙,類名首字母大寫(xiě)、
      : - 固定寫(xiě)法
      類的內(nèi)容 - 包含類的方法料扰、屬性和說(shuō)明文檔
      ? 方法就是聲明在類中的函數(shù)凭豪,
      ? 屬性就是聲明在類中的變量
  3. 對(duì)象的聲明
    語(yǔ)法:
    類名() - 創(chuàng)建指定的類的對(duì)象

    # 聲明一個(gè)人類
    class Person:
        """類的說(shuō)明文檔:人類"""
        num = 61
    
        def eat(self):
            print('人在吃飯')
    
    # 創(chuàng)建Person類的對(duì);p1就是person的對(duì)象
    p1 = Person()
    
    p1.eat()
    

對(duì)象方法

class 類名:
    類的屬性
    類的方法
  1. 類中的方法
    聲明在類中的函數(shù)就是方法
    類中的方法包括:對(duì)象方法(實(shí)例方法)晒杈,類方法嫂伞,靜態(tài)方法

  2. 對(duì)象方法:

    • 什么是對(duì)象方法
      ? 直接聲明在類中的方法就是對(duì)象方法
      ? 有默認(rèn)參數(shù)self
      ? 通過(guò) 對(duì)象.方法 的方式來(lái)調(diào)用(對(duì)象方法要通過(guò)對(duì)象來(lái)調(diào)用)
    • 參數(shù)
      ? 當(dāng)我們通過(guò)對(duì)象調(diào)用對(duì)象方法的時(shí)候,self不需要傳參;因?yàn)橄到y(tǒng)會(huì)將當(dāng)前對(duì)象傳遞給self
      ? 當(dāng)前對(duì)象: 調(diào)用當(dāng)前方法的對(duì)象(誰(shuí)調(diào)用對(duì)象方法的時(shí)候 self就是誰(shuí))
      ? 調(diào)用對(duì)象方法只給除self以外的參數(shù)傳參
    class Person:
        def run(self):
            # print(self)
            print('人在跑步')
    
        def eat(self, food):
            self.run()
            print(food)
    
    
    def main():
        # 創(chuàng)建對(duì)象
        p1 = Person()
        # print(p1)
        # 通過(guò)對(duì)象p1調(diào)用對(duì)象方法
        # p1.run()
        p1.eat('雞腿')
    
    
    if __name__ == '__main__':
        main()
    

init方法和構(gòu)造方法

  1. init方法: init
    init方法是類中的一個(gè)特殊的對(duì)象方法,專門(mén)用來(lái)對(duì)創(chuàng)建的對(duì)象進(jìn)行初始化的帖努。
    當(dāng)通過(guò)類創(chuàng)建對(duì)象的時(shí)候系統(tǒng)會(huì)自動(dòng)調(diào)用init方法

  2. 構(gòu)造方法

    • 什么是構(gòu)造方法
      函數(shù)名和類名相同的函數(shù)就是構(gòu)造方法撰豺,專門(mén)用來(lái)創(chuàng)造對(duì)象
      python中聲明類的時(shí)候,系統(tǒng)會(huì)自動(dòng)創(chuàng)建這個(gè)類對(duì)應(yīng)的構(gòu)造方法

    • 構(gòu)造方法的執(zhí)行過(guò)程
      當(dāng)我們調(diào)用構(gòu)造方法創(chuàng)造對(duì)象的時(shí)候拼余,內(nèi)部會(huì)先在內(nèi)存中開(kāi)辟空間保存對(duì)象污桦,然后用創(chuàng)建的這個(gè)對(duì)象調(diào)用init方法對(duì)對(duì)象進(jìn)行初始化
      init方法調(diào)用結(jié)束后,返回對(duì)象

      def Person():
      ? 對(duì)象 = 創(chuàng)建對(duì)象
      ? 對(duì)象.init()
      ? return 對(duì)象
      ?
      注意:如果類的init方法除了self以外還有其他參數(shù)姿搜,那么我們?cè)趧?chuàng)建對(duì)象的時(shí)候需要通過(guò)給構(gòu)造方法來(lái)給init方法傳參

      class Person:
          # 類中兩個(gè)下劃線開(kāi)頭并且兩個(gè)下劃線結(jié)尾的方法叫魔法方法寡润,不需要主動(dòng)調(diào)用,系統(tǒng)會(huì)自動(dòng)調(diào)用
          def __init__(self):
              print('__init__被調(diào)用了')
      
      
      class Dog:
          def __init__(self, x, y):
              print('dog的init')
      
      
      # 構(gòu)造方法偽代碼
      def my__init__(a, b):
          print(a, b)
          print('my__init__')
      
      
      def my_dog(*args, **kwargs):
          my__init__(*args, **kwargs)
      
      
      my_dog(a=10, b=20)
      

對(duì)象屬性

  1. 什么是對(duì)象屬性
    類中的屬性分為類的字段和對(duì)象屬性

    • 對(duì)象屬性 - 屬性的值會(huì)因?yàn)閷?duì)象不同而不一樣舅柜,這種屬性就應(yīng)該聲明為對(duì)象屬性
      聲明在init方法中 - 位置
      以'self.屬性 = 值'的方式類聲明(這兒的屬性就是對(duì)象屬性) -- 方式
      通過(guò)對(duì)象.屬性的方式來(lái)使用
    • 類的字段 - 屬性的值不會(huì)因?yàn)閷?duì)象的不同而不同梭纹,這種屬性就聲明成類的字段
      直接聲明在累的里面,函數(shù)的外面的變量
      以'字段名 = 值'
      通過(guò) '類.字段' 的方式來(lái)使用
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    
    # 練習(xí):創(chuàng)建dog類致份,有屬性名字变抽,類型,年齡
    # 創(chuàng)建Dog類的時(shí)候不能給年齡賦值可以給類型賦值氮块,也可以不用給類型賦值绍载,必須給名字賦值
    # 對(duì)象方法eat:打印xxx在吃什么
    class Dog:
        def __init__(self, name, type='哈士奇'):
            self.name = name
            self.age = 3
            self.type = type
    
        def eat(self, food):
            print(self.name + ' is eating ' + food)
    
    
    # 練習(xí)聲明一個(gè)矩形,類滔蝉,擁有屬性長(zhǎng)击儡、寬,方法面積和周長(zhǎng)
    class Rectangle:
        num = 52
    
        def __init__(self, length=4, width=3):
            self.length = length
            self.width = width
    
        def per(self):
            return 2*(self.length + self.width)
    
        def area(self):
            return self.length * self.width
    
    
    def main():
        p1 = Person('張三', 20)
        print(p1.name, p1.age)
    
        p2 = Person('郭銳', 18)
        print(p2.name, p2.age)
    
        dog1 = Dog('郭銳', type='中華田園犬')
        dog1.eat('shit')
    
        rec1 = Rectangle()
        print(rec1.per())
        print(rec1.area())
    
        rec1 = Rectangle(length=8, width=6)
        print(rec1.per())
        print(rec1.area())
        print(rec1.num)
    

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

python中對(duì)象的屬性支持增刪改查

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


class Dog:
    # __slots__ slots魔法
    # 約束當(dāng)前類的對(duì)象最多能擁有的屬性
    __slots__ = ('name', 'color')

    def __init__(self, name='', color='black'):
        self.name = name
        self.color = color


def main():
    p1 = Person('郭銳')
    p2 = Person('孫悟空')
    # 1.查
    """
    對(duì)象.屬性  -  獲取指定對(duì)象屬性值蝠引;當(dāng)屬性不存在的時(shí)候回報(bào)錯(cuò)
    getattr(對(duì)象, 屬性名:str, 默認(rèn)值)  -  獲取指定對(duì)象指定屬性值;
                                        當(dāng)屬性不存在的時(shí)候阳谍,如果給默認(rèn)值賦值,程序不會(huì)報(bào)錯(cuò)螃概,并且將默認(rèn)值作為結(jié)果矫夯。
                                        若不賦值,就會(huì)報(bào)錯(cuò)
    """
    print(p1.name)
    print(getattr(p1, 'name', None))
    print(getattr(p1, 'name', None))
    # 屬性不確定的時(shí)候使用getattr
    # 增/改
    """
    對(duì)象.屬性 = 值  -  當(dāng)對(duì)象屬性存在時(shí)修改屬性的值吊洼, 屬性不存在的時(shí)候添加屬性
    setattr(對(duì)象, 屬性名, 值)  -  當(dāng)屬性存在的時(shí)候修改屬性的值训貌;不存在的時(shí)候添加
    """
    print('===============增、改====================')
    p1.name = '郭小瑞'
    print(p1.name)
    # 添加屬性
    p1.height = 180
    print(p1.height)

    setattr(p1, 'height', 179)
    setattr(p1, 'weight', 180)
    print(p1.name, p1.age, p1.height, p1.weight)

    # 刪
    print('================刪除=======================')
    """
    del 對(duì)象.屬性
    delattr(對(duì)象, 屬性名)
    """
    del p1.sex
    # print(p1.sex)
    # delattr(p1, 'sex')

    # 對(duì)象指定的操作冒窍,只針對(duì)的哪一個(gè)對(duì)象递沪,你不會(huì)影響其他對(duì)象
    # python中的對(duì)象支持 增刪改查

    dog1 = Dog('大黃', 'yellow')

內(nèi)置屬性

內(nèi)置屬性指的是我們創(chuàng)建類的時(shí)候系統(tǒng)自動(dòng)個(gè)哦我們添加的屬性(其實(shí)是通過(guò)繼承獲取到了)

class Person:
    """人類"""
    num = 61
    # __slots__ = ('name', 'age', 'sex')

    def __init__(self, name='', age=0, sex='男'):
        self.name = name
        self.age = age
        self.sex = sex

    # 定制對(duì)象的打印格式(當(dāng)我們通過(guò)print打印一個(gè)對(duì)象的時(shí)候,實(shí)質(zhì)就是打印對(duì)象調(diào)用__repe__的返回值)
    # 這個(gè)函數(shù)的返回值是字符串
    # def __repr__(self):
    #     # return '{%s.%s object at %s}' % (self.__class__.__module__, self.__class__.__name__, hex(id(self)))
    #     return str(self.__dict__)[1:-1] + 'at' + hex(id(self))

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


def main():
    """
    1.類.__name__  -  獲取的名字
    """
    p1 = Person('郭銳')
    print(Person.__name__)
    # 值是一個(gè)字符串超燃, 可以當(dāng)成字符串
    class_name = Person.__name__
    print(Person, class_name.upper())

    """
    2.對(duì)象.__class__  -  獲取對(duì)象對(duì)應(yīng)的類
    """
    # 獲取對(duì)象p1的類
    my_class = p1.__class__
    print(my_class)
    # 可以將他當(dāng)做類來(lái)使用
    p2 = my_class('大黃')
    print(my_class.num)

    """
    3.類.__doc__  -  獲取類的說(shuō)明文檔(str)
    """
    print(my_class.__doc__)
    print(int.__doc__)

    """
    4.對(duì)象.__dict__  -  將對(duì)應(yīng)的對(duì)象轉(zhuǎn)換為字典区拳。將屬性和值作為字典的鍵值對(duì)(字典)
    """
    # setattr(p1, 'height', 18)
    print(p1.__dict__)
    # 當(dāng)給slots賦值后,對(duì)象的__dict__的屬性就不能使用
    # print(Person.__dict__)

    """
    5.類.__module__  -  獲取當(dāng)前類所在的模塊的模塊名
    """
    print(Person.__module__)

    """
    6.類.__bases__  -  獲取當(dāng)前類的父類(元組)
    """
    print(Person.__bases__)
    print(p1.__repr__())

    persons = [Person('p2', 12), Person('p3', 18, 'nv')]
    print(persons)

類方法和靜態(tài)方法

  1. 對(duì)象方法:

    • 怎么聲明:直接聲明在類型
    • 特點(diǎn):知道self參數(shù)意乓,調(diào)用的時(shí)候不用傳參
    • 怎么調(diào)用:對(duì)象.方法()
  2. 類方法:

    • 怎么聲明: 聲明函數(shù)前加@classmethod
    • 特點(diǎn):自帶cls默認(rèn)參數(shù),調(diào)用的不用傳參樱调,系統(tǒng)會(huì)自動(dòng)將調(diào)用當(dāng)前函數(shù)的類傳給他
      ? (cls是誰(shuí)調(diào)用就指向他)
      ? 類能做的事情cls都可以做约素,
    • 怎么調(diào)用:通過(guò)類來(lái)調(diào)用, 類.方法()
  3. 靜態(tài)方法:

    • 怎么聲明: 聲明函數(shù)前加@staticmethod
    • 特點(diǎn): 沒(méi)有默認(rèn)參數(shù)
    • 怎么調(diào)用:通過(guò)類來(lái)調(diào)用笆凌, 類.方法()
  4. 在類中怎么選擇使用哪種方法
    如果實(shí)現(xiàn)類中函數(shù)的功能需要使用對(duì)象的屬性圣猎,那么這個(gè)函數(shù)就要聲明成對(duì)象方法
    如果實(shí)現(xiàn)函數(shù)的功能不需要使用對(duì)象屬性的嵌套下,如果需要類的字段乞而,就聲明成類方法
    如果實(shí)現(xiàn)函數(shù)的功能既不需要對(duì)象屬性也不需要類的字段就聲明成靜態(tài)方法

    class Person:
        num = 61
    
        def __init__(self):
            self.name = '張三'
    
        def func4(self):
            print('%s對(duì)應(yīng)的對(duì)象' % self.name)
            print('人類的數(shù)量:%d億' % Person.num)
    
        @classmethod
        def fun2(cls):
            print('我是第二個(gè)類方法')
    
        @classmethod
        def func1(cls):
            # 通過(guò)cls創(chuàng)建對(duì)象
            p1 = cls()
            print(p1)
            print('cls:', cls)
            print('這是一個(gè)類方法')
            cls.num = 100   # cls來(lái)使用類的方法
            print(cls.num)
            cls.fun2()  # cls調(diào)用類方法
    
        @staticmethod
        def func3():
            print('這是一個(gè)靜態(tài)方法')
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末送悔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子爪模,更是在濱河造成了極大的恐慌欠啤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屋灌,死亡現(xiàn)場(chǎng)離奇詭異洁段,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)共郭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)祠丝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人除嘹,你說(shuō)我怎么就攤上這事写半。” “怎么了尉咕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵叠蝇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我年缎,道長(zhǎng)蟆肆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任晦款,我火速辦了婚禮,結(jié)果婚禮上枚冗,老公的妹妹穿的比我還像新娘缓溅。我一直安慰自己,他們只是感情好赁温,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布坛怪。 她就那樣靜靜地躺著,像睡著了一般股囊。 火紅的嫁衣襯著肌膚如雪袜匿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天稚疹,我揣著相機(jī)與錄音居灯,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怪嫌,可吹牛的內(nèi)容都是我干的义锥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼岩灭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拌倍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起噪径,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柱恤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后找爱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體梗顺,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年缴允,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荚守。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡练般,死狀恐怖矗漾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情薄料,我是刑警寧澤敞贡,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站摄职,受9級(jí)特大地震影響誊役,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谷市,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一蛔垢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迫悠,春花似錦鹏漆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鞠抑,卻和暖如春饭聚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搁拙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工秒梳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留法绵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓端幼,卻偏偏與公主長(zhǎng)得像礼烈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子婆跑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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

  • 今天聽(tīng)一個(gè)同事分享行業(yè)一家公司的經(jīng)營(yíng)之道此熬,如何做網(wǎng)絡(luò)營(yíng)銷,如何做客戶轉(zhuǎn)介紹滑进,收獲很大犀忱,一家公司成功肯定有成功的道理...
    一世驚鴻閱讀 101評(píng)論 0 0
  • CaptainRoy閱讀 173評(píng)論 0 0