day13 類 與 對(duì)象

1.什么是類,什么是對(duì)象

官方定義
類就是擁有相等功能和相同的屬性的對(duì)象的集合 -- 抽象的
對(duì)象就是類的實(shí)例 -- 具體

例: 類:人 對(duì)象: 王思聰

2.類的聲明

語(yǔ)法:

class 類名:
  類的內(nèi)容

說明:

class  -   聲明類的關(guān)鍵字
類名   -   標(biāo)識(shí)符,不能是關(guān)鍵字,首字母大寫
               采用駝峰式命名(采用首字母大寫的方式來(lái)區(qū)分多個(gè)單詞)
:         -    固定寫法
類的內(nèi)容  -   主要包含: 類的說明文檔、屬性(普通的變量)花盐、功能(函數(shù)/方法)

3.對(duì)象怎么聲明

對(duì)象 = 類()

4.類中的方法

1) 什么是方法:聲明在類中的函數(shù)就叫方法
2) 類中的方法有三種:對(duì)象方法、類方法、靜態(tài)方法
a. 對(duì)象方法: 直接聲明在類中的函數(shù)
            有默認(rèn)參數(shù)self论颅,通過對(duì)象調(diào)用的時(shí)候這個(gè)參數(shù)不用傳參,因?yàn)橄到y(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳遞給self囱嫩。
            (self恃疯,當(dāng)前對(duì)象 - 誰(shuí)調(diào)用self就指向誰(shuí),當(dāng)前類的對(duì)象能做的事情self都能做)
            通過類的對(duì)象來(lái)調(diào)用: 對(duì)象.對(duì)象方法()
            
b.類方法: 聲明函數(shù)前加@classmethod
         有默認(rèn)參數(shù)cls, 通過類調(diào)用的時(shí)候這個(gè)參數(shù)不用傳參,因?yàn)橄到y(tǒng)會(huì)自動(dòng)將當(dāng)前類傳遞給cls
         (cls墨闲,當(dāng)前類 - 誰(shuí)調(diào)用就指向誰(shuí)今妄,當(dāng)前類能做的事情cls都能做)
         通過類來(lái)調(diào)用: 類.類方法()

c.靜態(tài)方法:聲明函數(shù)前加@staticmethod
          沒有默認(rèn)參數(shù)
          通過類來(lái)調(diào)用: 類.靜態(tài)方法()
class Person:
    """人類"""
    # =========屬性==========
    # =========方法==========
    # ===============對(duì)象方法============
    def eat(self, food):
        # self = p1, food = '面條'
        # self = p2, food = '火鍋'
        print('self:', self)
        print('人吃'+food)
        self.study('python')

    def study(self, type):
        # self = p1, type = 'python'
        # self = p2, type = 'python'
        print('學(xué)習(xí)'+type)

    # ===============類方法================
    @classmethod
    def destroy(cls):
        # cls = Person
        # 通過cls創(chuàng)建對(duì)象
        tp = cls()      # tp = Person()
        cls.func1()     # Person.func1()
        print('tp:', tp)
        print('cls:', cls)
        print('人類破壞環(huán)境')

    @classmethod
    def func1(cls):
        # cls = Person
        print('臨時(shí)類方法')

    # ===============靜態(tài)方法================
    @staticmethod
    def beat_animal():
        print('人類毆打小動(dòng)物')


# 創(chuàng)建Person類的對(duì)象p1
p1 = Person()
p0 = p1
print(p1, p0)
p2 = Person()
print(p2)

# 對(duì)象調(diào)用對(duì)象方法
p1.eat('面條')
# p1.study()
p2.eat('火鍋')

# 類調(diào)用類方法
print(Person)
Person.destroy()

# 類調(diào)用靜態(tài)方法
Person.beat_animal()

什么是init方法

init是類默認(rèn)繼承的一個(gè)魔法方法,用來(lái)初始化類鸳碧; 本質(zhì)是對(duì)象方法盾鳞,但是不需要程序員自己調(diào)用,會(huì)被自動(dòng)調(diào)用瞻离。
通過類創(chuàng)建對(duì)象的時(shí)候(通過構(gòu)造方法創(chuàng)建對(duì)象)腾仅,系統(tǒng)會(huì)自動(dòng)調(diào)用類中的init方法,并且構(gòu)造方法中的實(shí)參會(huì)全部傳給init方法
創(chuàng)建對(duì)象的時(shí)候需不需要參數(shù),需要幾個(gè)參數(shù)套利,看這個(gè)類的init方法

(了解)聲明類的時(shí)候系統(tǒng)會(huì)自動(dòng)給我們創(chuàng)建一個(gè)函數(shù)推励,這個(gè)函數(shù)的函數(shù)名和聲明的類的類名一樣,這個(gè)函數(shù)叫構(gòu)造方法。
函數(shù)中會(huì)先在內(nèi)存中開辟空間創(chuàng)建對(duì)象肉迫,然后用創(chuàng)建的對(duì)象去調(diào)用類的init方法验辞,最后才將對(duì)象返回

class Person:
    def __init__(self, name, age):
        print(self, name, age)
        print('init方法')

# def Person(*args, **kwargs):
#     t = 創(chuàng)建對(duì)象
#     t.__init__(*args, **kwargs)
#     return t


print('===========')
p1 = Person('yuting', 18)
print(p1)
print('===========')

p2 = Person('小明', age=20)

# ========模擬構(gòu)造方法和init的關(guān)系=========
def yt_init(name, age):
    print('自己的init', name)


def yt_Person(*args, **kwargs):
    # args = ('yuting',)  kwargs={}
    yt_init(*args, **kwargs)


yt_Person('xiaoming', 20)
yt_Person(name='張三', age=21)
yt_Person('xiaohua', age=9)

屬性

類中的屬性分為:對(duì)象屬性和字段

1)字段: 直接聲明在類中變量就是字段;
字段要通過'類.字段'的方式來(lái)使用;
當(dāng)屬性的值不會(huì)因?yàn)閷?duì)象不同而不同,這種屬性就可以聲明成類的字段

2)對(duì)象屬性: 在init方法中喊衫,以'self.屬性 = 值'的形式聲明;
對(duì)象屬性要通過'對(duì)象.屬性'的方式來(lái)使用
當(dāng)屬性的值會(huì)因?yàn)閷?duì)象不同而不同的時(shí)候跌造,使用對(duì)象屬性

class Dog:
    """狗"""
    # =========字段==========
    numbers = 10

    # =========對(duì)象屬性========
    def __init__(self, name1, color1='黃色', gender1='公'):
        self.name = name1
        self.color = color1
        self.gender = gender1
        self.age = 0


# 使用類的字段
Dog.numbers = 100
print(Dog.numbers)

# 使用對(duì)象屬性
dog1 = Dog('大黃')
print(dog1.color)
print(dog1.gender)
print(dog1.age)

dog2 = Dog('財(cái)財(cái)', color1='灰色')
print(dog2.color)
print(dog2.gender)
print(dog2.age)

練習(xí): 聲明一個(gè)學(xué)生類,擁有屬性:名字族购、電話鼻听、年齡、學(xué)號(hào) 擁有功能: 學(xué)習(xí)(打印XXX在學(xué)XXX)

class Student:

    number = 1000

    def __init__(self, name, tel='', age=0):
        self.name = name
        self.tel = tel
        self.age = age
        self.num = '0000'

    def study(self, subject: str):
        print(Student.number)
        print(self.name+'在學(xué)'+subject)


stu = Student('小明', '182323332', 12)
stu.study('python')

stu1 = Student('小花', '182323332', 12)
stu1.study('H5')

寫一個(gè)矩形類联四,有屬性:長(zhǎng)和寬 方法:求面積撑碴、求周長(zhǎng)

class Rect:
    """矩形"""
    def __init__(self, length, width):
        self.length = length
        self.width = width

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

    def perimeter(self):
        return (self.length + self.width)*2


r1 = Rect(100, 56)
print(r1.area(), r1.perimeter())

2.聲明類的時(shí)候方法的選擇(記住)!!!

1)對(duì)象方法: 實(shí)現(xiàn)函數(shù)的功能需要對(duì)象屬性的時(shí)候朝墩,就使用對(duì)象方法
2)類方法: 實(shí)現(xiàn)函數(shù)的功能不需要對(duì)象屬性,但是需要類的相關(guān)的操作醉拓,就使用類方法
3)靜態(tài)方法: 實(shí)現(xiàn)函數(shù)的功能既不需要對(duì)象屬性伟姐,也不需要類相關(guān)的操作,就使用靜態(tài)方法

python中的對(duì)象屬性支持增亿卤、刪愤兵、改、查


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


dog1 = Dog('大黃')
dog2 = Dog('財(cái)財(cái)')

1.查

"""
a. 對(duì)象.屬性 - 獲取指定對(duì)象指定屬性對(duì)應(yīng)的值, 如果屬性不存在會(huì)報(bào)錯(cuò)
b. getattr(對(duì)象, 屬性名, 默認(rèn)值) - 獲取指定對(duì)象指定屬性對(duì)應(yīng)的值排吴;
當(dāng)屬性不存在有默認(rèn)值的時(shí)候不報(bào)錯(cuò)秆乳,返回默認(rèn)值。沒有默認(rèn)值的時(shí)候報(bào)錯(cuò)
"""

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

print(getattr(dog1, 'name2', 100))

2.增钻哩、改

"""
a. 對(duì)象.屬性 = 值 - 當(dāng)屬性不存在就添加屬性屹堰,當(dāng)屬性存在修改屬性的值
b. setattr(對(duì)象, 屬性名, 值) - 當(dāng)屬性不存在就添加屬性,當(dāng)屬性存在修改屬性的值
"""

dog1.gender = '雌'
print(dog1.gender)
dog1.name = '貝貝'
print(dog1.name)

a_name = 'color'
setattr(dog1, 'color', '白色')
print(getattr(dog1, 'color'))
setattr(dog1, 'name', '金金')
print(dog1.name)

3.刪

"""
a. del 對(duì)象.屬性
b. delattr(對(duì)象, 屬性名)
"""

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


# 注意: 對(duì)象屬性的增刪改查只針對(duì)單個(gè)對(duì)象
# print(dog2.gender)   #  AttributeError: 'Dog' object has no attribute 'gender'

print(dog2.name, dog2.age)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末街氢,一起剝皮案震驚了整個(gè)濱河市扯键,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌珊肃,老刑警劉巖荣刑,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異伦乔,居然都是意外死亡厉亏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門烈和,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爱只,“玉大人,你說我怎么就攤上這事斥杜∈牛” “怎么了沥匈?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蔗喂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我高帖,道長(zhǎng)缰儿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任散址,我火速辦了婚禮乖阵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘预麸。我一直安慰自己瞪浸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布吏祸。 她就那樣靜靜地躺著对蒲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹈矮,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天砰逻,我揣著相機(jī)與錄音,去河邊找鬼泛鸟。 笑死蝠咆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的北滥。 我是一名探鬼主播刚操,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼碑韵!你這毒婦竟也來(lái)了赡茸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祝闻,失蹤者是張志新(化名)和其女友劉穎占卧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體联喘,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡华蜒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豁遭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叭喜。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蓖谢,靈堂內(nèi)的尸體忽然破棺而出捂蕴,到底是詐尸還是另有隱情,我是刑警寧澤闪幽,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布啥辨,位于F島的核電站,受9級(jí)特大地震影響盯腌,放射性物質(zhì)發(fā)生泄漏溉知。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一腕够、第九天 我趴在偏房一處隱蔽的房頂上張望级乍。 院中可真熱鬧,春花似錦帚湘、人聲如沸玫荣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捅厂。三九已至材诽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恒傻,已是汗流浹背脸侥。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盈厘,地道東北人睁枕。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像沸手,于是被迫代替她去往敵國(guó)和親外遇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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