day_12面對對象基礎(chǔ)

1.迭代器和生成器

生成器:a.可以看成是一個可以存儲多個數(shù)據(jù)的容器董瞻。需要里面的數(shù)據(jù)的時候,就生成一個田巴,里面的數(shù)據(jù)只能從前往后钠糊,一個一個的生成,
不能跳躍壹哺,也不能從后往前抄伍。生成的數(shù)據(jù),不能再生成了
b.獲取生成器里面的數(shù)據(jù)管宵,需要使用next()方法
c.只要函數(shù)聲明中有yield關(guān)鍵字截珍,函數(shù)就不再是一個單純的函數(shù),而是一個生成器

和列表比較:列表存數(shù)據(jù)箩朴,數(shù)據(jù)必須是實實在在存在的數(shù)據(jù)岗喉,一個數(shù)據(jù)會占一定的內(nèi)容空間。
生成器存數(shù)據(jù)炸庞,存的是產(chǎn)生數(shù)據(jù)的算法钱床,沒有數(shù)據(jù)去占用內(nèi)存空間

實例:

# 斐波拉切數(shù)列
# 1,1,2,3,5,8,13,21....
def xu_lie(n):
    pre_1 = 1
    pre_2 = 1
    for x in range(1, n+1):
        if x == 1 or x == 2:
            current = 1
            yield current
            continue
        current = pre_1 + pre_2
        pre_1, pre_2 = pre_2, current
        # print(current)
        yield current

xulie = xu_lie(10)
print(xulie.__next__())
print(xulie.__next__())
print(xulie.__next__())

if __name__ == '__main__':
    x = (i for i in range(10))
    # x 就是一個生成器,用來產(chǎn)生數(shù)據(jù)
    print(x)
    print(x.__next__())
    print(x.__next__())

2.認識面向?qū)ο?/h1>

1.什么是類:對擁有相同屬性和方法的對象的封裝
類是抽象的
類中相同的屬性的值是不能確定的

2.什么是對象:對象就是類的實例
對象是具體的
對象的屬性是確定的

如果說人是一個類燕雁,那么余婷就是一個對象
如果說電腦是一個類,我桌上的這臺mac就是一個對象

3.面向?qū)ο缶幊?br> 面向過程編程:一步一步的寫代碼實現(xiàn)功能 --> 工具:邏輯和算法
函數(shù)式編程:面對問題考慮有沒有擁有某種功能的函數(shù) --> 工具:函數(shù)
面向?qū)ο缶幊蹋好鎸栴}考慮有沒有相應(yīng)的對象來解決這個問題 --> 工具:類和對象

3.類的聲明

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

class:Python中聲明類的關(guān)鍵字
類名:標(biāo)識符鲸拥,類名首字母大寫拐格,駝峰式命名
():類要繼承自其它的類,需要寫括號刑赶,括號里面是父類名
屬性:對象屬性和類的字段 --- 保存數(shù)據(jù)
方法:實質(zhì)就是聲明在類中的函數(shù) --- 實現(xiàn)功能

3.1.聲明一個類Person

class Person:
    """
    類的說明:人類
    """
    # 聲明對象方法捏浊,需要使用對象來調(diào)用
    # 對象方法默認都有一個參數(shù)self,在調(diào)用方法的時候撞叨,不用傳參(系統(tǒng)會自動給self傳參)
    # 誰來調(diào)用這個方法金踪,self就是誰
    def eat(self):
        print('在吃飯')

    def sleep(self):
        print('在睡覺浊洞,(|3[▓▓] 晚安')

3.2.聲明對象

通過類的構(gòu)造方法去創(chuàng)建對象(名字和類名同名的方法就是構(gòu)造方法,自動生成)
對象名 = 類名()
類的對象可以通過點語法使用類中聲明的對象方法和屬性
對象.方法名()
對象.屬性名

 per1 = Person()
    print(per1)
    per1.sleep()
    per1.eat()

    # 一個類可以有多個對象
    per2 = Person()
    print(per2)
    per2.eat()

4.對象的屬性

4.1對象屬性的聲明

class 類名:
??? ?def init(self):
??? ???? ?self.屬性名 = 初值
?? ???? ? self.屬性名2 = 初值2

class Person:
    """人類"""
    """
    a.init方法是系統(tǒng)自帶的一個方法胡岔,這個方法不能直接調(diào)用法希,通過類創(chuàng)建對象的時候,系統(tǒng)會自動調(diào)用這個方法
      init方法的作用是對對象屬性進行初始化
    b.通過構(gòu)造方法創(chuàng)建對象的時候靶瘸,一定要保證苫亦,init方法中除了self外,其它的參數(shù)都必須有值
    """

    def __init__(self, name1='', age1=0, sex1='男'):
        # 在這個地方聲明對象的屬性
        # print(name1)
        # print('====')
        # 在init方法中聲明對象的屬性
        """
        name怨咪、age和sex就是Person這個類的對象屬性屋剑。類的對象屬性,需要通過對象來使用
        """
        self.name = name1
        self.age = age1
        self.sex = sex1
if __name__ == '__main__':
    # 注意:構(gòu)造方法中的參數(shù)诗眨,實質(zhì)是傳給init方法的參數(shù)
    p1 = Person('xxx', 18)
    # 通過對象使用對象屬性
    print(p1.name, p1.age, p1.sex)

    p2 = Person('駱浩', 33, '男')
    print(p2.name, p2.age, p2.sex)

    # 創(chuàng)建對象的時候可以不給屬性賦值
    p3 = Person()
    p4 = Person(sex1='女')

5.對象屬性的增刪改查

class Dog:
    """狗類"""
    def __init__(self, age1=0, color1='yellow'):
        self.age = age1
        self.color = color1

5.1.查(獲取屬性)

"""
    方法一:對象.屬性(如果屬性不存在唉匾,會報錯)
    方法二:對象.__getattribute__(屬性名) 和 getattr(對象名, 屬性)
    """
    print(dog1.age, dog1.color)
    print(dog1.__getattribute__('age'))
    print(getattr(dog1, 'age'))

    # 如果設(shè)置了default的值,那么當(dāng)屬性不存在的時候不會報錯匠楚,并且返回默認值
    print(getattr(dog1, 'abc', None))

5.2.改(修改屬性的值)

"""
    方法一:對象.屬性 = 新值
    方法二:對象.__setattr__(屬性名, 新值)和setattr(對象名, 屬性名, 新值)
    """
    dog1.age = 4
    print(dog1.age)

    dog1.__setattr__('color', 'black')
    print(dog1.color)
    setattr(dog1, 'color', 'blue')
    print(dog1.color)

5.3.增

"""
    方法一:對象.屬性 = 值(屬性不存在巍膘,就是天津)
    注意:屬性是添加給對象的,而不是類的
    """
    dog1.name = '大黃'
    print(dog1.name)
    # dog2 = Dog()
    # print(dog2.name)

    dog1.__setattr__('type', '哈士奇')
    print(dog1.type)
    setattr(dog1, 'sex', '公')
    print(dog1.sex)

5.4刪(刪除對象屬性)

"""
    方法一:del 對象.屬性
    方法二:__delattr__(屬性名)和delattr(對象名, 屬性名)
    注意:只是刪除對象的屬性油啤,不會影響到類的其它對象
    """
    del dog1.age
    # print(dog1.age)  # AttributeError: 'Dog' object has no attribute 'age'

    dog1.__delattr__('sex')
    # print(dog1.sex)
    delattr(dog1, 'type')
    # print(dog1.type)

練習(xí)

"""
練習(xí):聲明一個學(xué)生類典徘,擁有屬性:姓名、性別益咬、年齡逮诲。方法:學(xué)習(xí)
1.聲明學(xué)生類的對象,聲明的時候就給姓名幽告、性別和年齡賦值
2.通過三種方式分別獲取姓名梅鹦、性別和年齡,并且打印
3.給學(xué)生對象添加一個屬性冗锁,電話
4.修改學(xué)生的年齡
5.刪除學(xué)生的性別
"""
class Student():
    def __init__(self, name='', sex='', age=0):
        self.name = name
        self.sex = sex
        self.age = age

    def study(self):
        print('%s在學(xué)習(xí)中' % self.name)

stu1 = Student('xxx', '男', 18)
stu1.study()

print(stu1.name)
print(stu1.__getattribute__('sex'))
print(getattr(stu1, 'age'))

stu1.tel = '123'
print(getattr(stu1, 'tel'))
setattr(stu1, 'id', '111')
print(stu1.id)

stu1.age = 22
print(stu1.age)
setattr(stu1, 'id', '222')
print(stu1.id)

del stu1.sex
# delattr(stu1, 'sex')

6.slots魔法

功能:就是約束類中的對象屬性


class Person:
    """人類"""
    # __slots__的功能:就是約束類中的對象屬性
    __slots__ = ('name', 'age', 'sex', 'id')
    def __init__(self, name='', age=0):
        self.name = name
        self.age = age
        # self.tel = 123  # AttributeError: 'Person' object has no attribute 'tel'

    # 自定義對象的打印格式
    def __str__(self):
        return 'name:%s age:%d address:0x%x' % (self.name, self.age, id(self))


if __name__ == '__main__':
    p1 = Person('xx', 20)
    # p1.names = 'aa'  # AttributeError: 'Person' object has no attribute 'names'
    # p1.sex = '男'
    print(p1)

7.類中的方法

屬性:對象的屬性齐唆、類的屬性(字段)
對象屬性:屬于對象的,不同對象對應(yīng)的值可能不一樣(對象屬性通過對象來使用)
類的字段:聲明在類里面冻河,函數(shù)外面箍邮。類的屬性屬于類(類的字段,通過類來使用)

方法:對象的方法叨叙、類方法锭弊、靜態(tài)函數(shù)
對象方法:自帶一個self參數(shù),一般要通過對象去調(diào)用
類方法:1.使用@classmethod修飾
2.自帶一個cls參數(shù)擂错,并且這個參數(shù)不用傳參味滞,誰來調(diào)用cls就指向誰
3.類方法要通過類來調(diào)用
靜態(tài)函數(shù):1.使用@staticmethod修飾
2.沒有默認參數(shù)
3.靜態(tài)方法要通過類來調(diào)用

怎么選擇用對象方法、類方法、靜態(tài)方法剑鞍?
對象方法:如果實現(xiàn)函數(shù)的功能需要使用對象的屬性昨凡,就聲明成對象方法
類方法:如果實現(xiàn)函數(shù)的功能需要使用類的字段,或者調(diào)用類的方法蚁署,就聲明成類方法
靜態(tài)方法:如果實現(xiàn)函數(shù)功能即不需要對象屬性便脊,也不需要類的字段,就聲明成靜態(tài)方法

補充:ctr + r --> 查找替換
ctr + f --> 查找

class MyPerson:
    """人類"""
    # number是類字段(人類的數(shù)量)
    number = 0

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

    # eat方法是對象方法
    def eat(self, food):
        print('%s在吃%s' % (self.name, food))

    @classmethod
    def hurt_earth(cls):
        # cls指向的是調(diào)用這個方法的類形用,使用cls可以當(dāng)成類來使用
        pt = cls('張三')  # 可以使用cls創(chuàng)建對象
        print(pt.name)
        print(pt.number)  # 可以通過cls使用類的字段
        print('人類破壞環(huán)境')

    #protect_earth是一個靜態(tài)方法
    @staticmethod
    def protect_earth():
        pt = MyPerson()
        print(pt.number)
        print('人類保護地球')


if __name__ == '__main__':
    # 1.類的字段要用類來使用
    print(MyPerson.number)

    # 2.對象的屬性通過對象來使用
    p1 = MyPerson('xxx', 18)
    print(p1.name)
    # 3.對象方法用對象調(diào)用
    p1.eat('面條')

    p2 = MyPerson('aaa')
    p2.eat('火鍋')

    # 4.類方法通過類來調(diào)用
    MyPerson.hurt_earth()

    # 5.靜態(tài)方法通過類來調(diào)用
    MyPerson.protect_earth()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末就轧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子田度,更是在濱河造成了極大的恐慌妒御,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镇饺,死亡現(xiàn)場離奇詭異乎莉,居然都是意外死亡,警方通過查閱死者的電腦和手機奸笤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門惋啃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人监右,你說我怎么就攤上這事边灭。” “怎么了健盒?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵绒瘦,是天一觀的道長。 經(jīng)常有香客問我扣癣,道長惰帽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任父虑,我火速辦了婚禮该酗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘士嚎。我一直安慰自己呜魄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布莱衩。 她就那樣靜靜地躺著爵嗅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膳殷。 梳的紋絲不亂的頭發(fā)上操骡,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音赚窃,去河邊找鬼册招。 笑死,一個胖子當(dāng)著我的面吹牛勒极,可吹牛的內(nèi)容都是我干的是掰。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼辱匿,長吁一口氣:“原來是場噩夢啊……” “哼键痛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匾七,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤絮短,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昨忆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丁频,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年邑贴,在試婚紗的時候發(fā)現(xiàn)自己被綠了席里。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡拢驾,死狀恐怖奖磁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情繁疤,我是刑警寧澤咖为,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站嵌洼,受9級特大地震影響案疲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜麻养,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一褐啡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鳖昌,春花似錦备畦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糕档,卻和暖如春莉恼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工俐银, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尿背,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓捶惜,卻偏偏與公主長得像田藐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吱七,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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

  • 前言 人生苦多汽久,快來 Kotlin ,快速學(xué)習(xí)Kotlin踊餐! 什么是Kotlin景醇? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,173評論 9 118
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)吝岭,斷路器啡直,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 林心如從一個沒有背景的小明星微峰,逆襲到現(xiàn)在的女王舷丹,還收獲男神霍建華的心。職場女性可以從她的身上學(xué)到兩個逆襲的辦法蜓肆。 ...
    靜蘭繪閱讀 235評論 0 4
  • 作者:許鄉(xiāng)愁 我的理想就是考不上大學(xué) 即使考上了也拿不到畢業(yè)證 即使拿到了也找不到工作 即使找到了也會得罪領(lǐng)導(dǎo) 我...
    JohnWong211閱讀 875評論 0 0
  • 親愛的孩子們: 你們好颜凯!當(dāng)你們能夠讀懂這封信的時候,為你們寫信的哥哥已經(jīng)變成叔叔了仗扬。此信是叔叔代表昌公書局志愿捐書...
    端銀閱讀 244評論 1 1