day16-類和對(duì)象

1.編程思想

1)編程思想

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

2)類和對(duì)象

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

如果人是類 - 某個(gè)人就是對(duì)象
如果杯子是對(duì)象 - 具體某個(gè)杯子(桌上的杯子)就是對(duì)象

2.類和對(duì)象的聲明

1)類的聲明(定義類)

類就是擁有相同功能(函數(shù))和相同屬性(保存數(shù)據(jù)的變量烘绽,也叫屬性)的集合

a.語法

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

b.說明

class - 關(guān)鍵字迫悠,固定寫法
類名 - 程序員自己命名
要求:必須是標(biāo)識(shí)符,不能是關(guān)鍵字
規(guī)范:見名知義;駝峰式命名并且首字母大寫(studentName)节吮;不能使用系統(tǒng)提供的函數(shù)名、模塊名或類名
類的說明文檔 - 注釋纷责,主要用來說明類中提供的功能有哪些
類的內(nèi)容 - 主要包含類中的函數(shù)(方法)和屬性
方法:對(duì)象方法哼丈、類方法和靜態(tài)
屬性:類的字段和對(duì)象屬性

class Person:
    """人類:有學(xué)習(xí)边器、吃飯和睡覺三個(gè)功能"""
    def study(self):
        print('人類在學(xué)習(xí)')

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

    def sleep(self):
        print('人在睡覺')

2)創(chuàng)建對(duì)象

a.語法

類() - 創(chuàng)建指定類對(duì)應(yīng)的對(duì)象

b.說明

類 - 已經(jīng)聲明過的類

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

3.對(duì)象方法

1)對(duì)象方法

1.怎么聲明:直接聲明在類中的函數(shù)就是對(duì)象方法
2.特點(diǎn):自帶一個(gè)參數(shù)self训枢;當(dāng)通過對(duì)象去調(diào)用對(duì)象方法的時(shí)候self不用傳參,
因?yàn)橄到y(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self(當(dāng)前對(duì)象:用哪個(gè)對(duì)象調(diào)用的self就是誰)
3.怎么調(diào)用:通過對(duì)象來調(diào)用忘巧,以‘對(duì)象.方法名()’的形式來調(diào)用

class Person:
    def eat(self):
        print('self:', self)
        print('吃')


p1 = Person()
print('p1:', p1)
p1.eat()

p2 = Person()
print('p2:', p2)
p2.eat()

# 注意:從語法來說恒界,類中聲明的函數(shù)都可以用類和對(duì)象調(diào)用,但是實(shí)際開發(fā)的時(shí)候?qū)ο蠓椒ㄖ荒苡脤?duì)象調(diào)用
# Person.eat(12)

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

1)構(gòu)造方法

構(gòu)造方法就是用來創(chuàng)建對(duì)象函數(shù)砚嘴;構(gòu)造方法的名字和類名一樣的十酣。
python中的構(gòu)造方法:
a.當(dāng)聲明類的時(shí)候系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)函數(shù)名和類名同名的構(gòu)造方法。
b.當(dāng)通過對(duì)象方法創(chuàng)建對(duì)象的時(shí)候际长,會(huì)自動(dòng)調(diào)用init方法來對(duì)對(duì)象進(jìn)行初始化操作

2)init方法

init是類中一個(gè)特殊的對(duì)象方法耸采;這個(gè)方法不需要主動(dòng)調(diào)用,用來對(duì)對(duì)象初始化的

3)主要掌握(必須掌握9び)

a.通過構(gòu)造方法創(chuàng)建對(duì)象的時(shí)候虾宇,類中init會(huì)被自動(dòng)調(diào)用
b.類中的init方法可以寫也可以不用寫,如果寫函數(shù)名和參數(shù)self不能動(dòng)如绸,但是可以隨意添加其他函數(shù)
c.如果init方法中有除了self以外的參數(shù)嘱朽,那么創(chuàng)建對(duì)象的時(shí)候需要在構(gòu)造方法中給這些參數(shù)傳參

5.屬性

1)什么是屬性

屬性就是聲明在類中的變量;python中類的屬性分為類的字段和對(duì)象屬性兩種

2)類的字段(不是重點(diǎn))

直接聲明在類的里面怔接,函數(shù)的外面的變量就是類的字段
1)怎么聲明:直接聲明在類中
2)怎么使用:通過類來使用:以‘類.字段’的形式使用
3)什么時(shí)候用:保存的屬性值不會(huì)因?yàn)閷?duì)象不同而不一樣的時(shí)候使用

3)對(duì)象屬性(特別重要)

1)怎么聲明:聲明在init方法中搪泳,以'self.屬性 = 值'的形式聲明
2)怎么使用:通過對(duì)象來使用:以'對(duì)象.屬性'的形式使用
3)什么時(shí)候用:屬性值會(huì)因?yàn)閷?duì)象不同而不一樣的屬性就聲明成對(duì)象屬性


class Person:
    # num就是字段
    num = 61

    def __init__(self, name1, gender='男'):
        # name, age, gender就是對(duì)象屬性
        self.name = name1
        self.age = 18
        self.gender = gender

    def eat(self):
        food = '米飯'

    # 練習(xí):給Person類添加一個(gè)學(xué)習(xí)的對(duì)象方法,要求實(shí)現(xiàn)打佣笃辍:‘xxx在學(xué)習(xí)岸军!’
    def study(self):
        print('%s在學(xué)習(xí)' % self.name)


print(Person.num)
p1 = Person('小明', '女')
print(p1.name, p1.age, p1.gender)
p1.name = '小華'
print(p1.name, p1.age, p1.gender)
p1.study()

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

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

class Dog:
    def __init__(self, name, color, breed, age=3):
        self.name = name
        self.age = age
        self.color = color
        self.breed = breed


dog1 = Dog('大黃', '黃色', '薩摩耶')

1.查 - 獲取對(duì)象屬性的值
a.
對(duì)象.屬性 - 獲取指定對(duì)象指定屬性的值
b.
getattr(對(duì)象,屬性名) - 獲取指定對(duì)象指定屬性的值瓦侮,屬性不存在會(huì)報(bào)錯(cuò)
getattr(對(duì)象艰赞,屬性名,默認(rèn)值) - 獲取指定對(duì)象指定屬性的值,屬性不存在的時(shí)候不會(huì)報(bào)錯(cuò)而是返回指定的默認(rèn)值

print(dog1.breed)
# print(dog1.gender)   # AttributeError: 'Dog' object has no attribute 'gender'
print(getattr(dog1, 'age'))    # 3
# attr_name = input('請(qǐng)輸入屬性名:')
# print(getattr(dog1, attr_name))

print(getattr(dog1, 'gender', 'women'))   # women

2.增肚吏、改
a.對(duì)象.屬性 = 值 - 當(dāng)屬性存在的時(shí)候猖毫,修改指定屬性對(duì)應(yīng)的值;當(dāng)屬性不存在的時(shí)候须喂,給對(duì)象添加屬性
b.setattr(對(duì)象吁断,屬性名,值) - 當(dāng)屬性存在的時(shí)候坞生,修改指定屬性對(duì)應(yīng)的值仔役;當(dāng)屬性不存在的時(shí)候,給對(duì)象添加屬性

dog1.name = '旺財(cái)'
print(dog1.name)

dog1.gender = 'man'
print(dog1.gender)

setattr(dog1, 'age', 12)
print(getattr(dog1, 'age'))

setattr(dog1, 'weight', 10)
print(getattr(dog1, 'weight'))

3.刪 - 刪除屬性
a.del 對(duì)象.屬性 - 刪除對(duì)象中指定的屬性
b.delattr(對(duì)象是己,屬性名) - 刪除對(duì)象中指定的屬性

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

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

7.內(nèi)置類屬性

1)內(nèi)置類屬性

創(chuàng)建類的時(shí)候又兵,系統(tǒng)自動(dòng)添加的屬性就是內(nèi)置類屬性

2)常見的內(nèi)置類屬性

class Dog:
    """類的說明文檔:狗類"""
    num = 100

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

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

    # 定制當(dāng)前類的對(duì)象的打印
    # def __str__(self):
    #     return '<%s>' % str(self.__dict__)[1: -1]
    def __repr__(self):
        return '<%s>' % str(self.__dict__)[1: -1]


dog1 = Dog('大黃')

1.name
字段
類.name - 獲取當(dāng)前類的類名

print('一只狗的對(duì)象是%s類型' % Dog.__name__)

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

print(Dog.__doc__)
print(int.__doc__)

3.class
對(duì)象.class - 獲取指定對(duì)象對(duì)應(yīng)的類(和type的功能一樣)

print(dog1.__class__)
print(type(dog1))

4.dict
類.dict -獲取指定類中所有的字段和對(duì)應(yīng)的值,以字典的形式返回(了解)
對(duì)象.dict - 獲取對(duì)象所有的屬性和對(duì)應(yīng)的值卒废,以字典的形式返回(掌握)

print(Dog.__dict__)
print(dog1.__dict__)

# 應(yīng)用一:定制對(duì)象的打印效果
dog2 = Dog('小黃', 2)
print(dog1)
print(dog2)

dogs = [dog1, dog2]
print(dogs)

# 應(yīng)用二:將對(duì)象轉(zhuǎn)換成字典
dict1 = dog2.__dict__
print(dict1)


# 將字典轉(zhuǎn)換成對(duì)象
class Dog2:
    def __init__(self, dic1):
        for key in dic1:
            setattr(self, key, dic1[key])


dog11 = Dog2(dict1)
print(dog11)

5.module
類.module - 獲取指定類所在的模塊的模塊名

print(int.__module__)
print(bool.__module__)
print(Dog2.__module__)    # __main__

6.bases
類.bases - 獲取當(dāng)前類的父類
object - 是基類

print(Dog.__bases__)

8.slots魔法

1)slots - 約束當(dāng)前類的對(duì)象能夠擁有哪些屬性

如果在類中給slots賦值:a.賦值后沛厨,slots對(duì)應(yīng)的元組中的元素就是當(dāng)前類的對(duì)象能夠擁有的所有屬性


class Person:
    __slots__ = ('name', 'age', 'gender')

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


p1 = Person('小明')

# p1.name1 = '小紅'   # AttributeError: 'Person' object has no attribute 'name1'
p1.gender = 'man'
print(p1.gender)

# 注意:如果類中設(shè)置了__slots__的值,那么這個(gè)類的對(duì)象就不能使用__dict__
# print(p1.__dict__)   # AttributeError: 'Person' object has no attribute '__dict__'

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

1)類中的方法

類中的方法有三種:對(duì)象方法摔认、類方法逆皮、靜態(tài)方法

a.對(duì)象方法

怎么聲明:直接聲明在類中
怎么調(diào)用:用對(duì)象來調(diào)用
特點(diǎn):自帶參數(shù)self,self在調(diào)用的時(shí)候不用傳參,系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給它
什么時(shí)候用:(實(shí)現(xiàn)函數(shù)功能需要對(duì)象) 實(shí)現(xiàn)函數(shù)的功能需要用到對(duì)象屬性就使用對(duì)象方法

b.類方法

怎么聲明:在裝飾器@classmethod后面聲明函數(shù)
怎么調(diào)用:用類來調(diào)用
特點(diǎn):有默認(rèn)參數(shù)cls,cls在調(diào)用的時(shí)候不用傳參参袱,系統(tǒng)會(huì)自動(dòng)將當(dāng)前類傳給它电谣。(類能做的cls都可以做)
什么時(shí)候用:(實(shí)現(xiàn)函數(shù)功能不需要對(duì)象的前提下,需要類)

c.靜態(tài)方法

怎么聲明:在裝飾器@staticmethod后面聲明函數(shù)
怎么調(diào)用:用類來調(diào)用
特點(diǎn):沒有任何默認(rèn)參數(shù)
什么時(shí)候用:(實(shí)現(xiàn)函數(shù)的功能既不需要類也不需要對(duì)象)


class Student:
    num = 10

    def __init__(self, name, score):
        self.name = name
        self.study_id = '001'
        self.score = score

    def func0(self):
        print('這是一個(gè)對(duì)象方法')

    @classmethod
    def func1(cls):
        print(cls)
        # 類能做的cls也能做
        stu2 = cls('小花', 89)
        print(stu2)
        print(cls.num)
        print('這是一個(gè)類方法')
        cls.func2()

    @staticmethod
    def func2():
        print('靜態(tài)方法')


stu1 = Student('小明', 90)
stu1.func0()

Student.func1()
print(Student)

Student.func2()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抹蚀,一起剝皮案震驚了整個(gè)濱河市剿牺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌环壤,老刑警劉巖晒来,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異郑现,居然都是意外死亡湃崩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門懂酱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竹习,“玉大人,你說我怎么就攤上這事列牺≌埃” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵瞎领,是天一觀的道長泌辫。 經(jīng)常有香客問我,道長九默,這世上最難降的妖魔是什么震放? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮驼修,結(jié)果婚禮上殿遂,老公的妹妹穿的比我還像新娘诈铛。我一直安慰自己,他們只是感情好墨礁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布幢竹。 她就那樣靜靜地躺著,像睡著了一般恩静。 火紅的嫁衣襯著肌膚如雪焕毫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天驶乾,我揣著相機(jī)與錄音邑飒,去河邊找鬼。 笑死级乐,一個(gè)胖子當(dāng)著我的面吹牛疙咸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唇牧,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼罕扎,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了丐重?” 一聲冷哼從身側(cè)響起腔召,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扮惦,沒想到半個(gè)月后臀蛛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崖蜜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年浊仆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豫领。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抡柿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出等恐,到底是詐尸還是另有隱情洲劣,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布课蔬,位于F島的核電站囱稽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏二跋。R本人自食惡果不足惜战惊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扎即。 院中可真熱鬧吞获,春花似錦况凉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撤逢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粮坞,已是汗流浹背蚊荣。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莫杈,地道東北人互例。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像筝闹,于是被迫代替她去往敵國和親媳叨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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