12-迭代器、面向?qū)ο?/h2>

一、生成器

a. 可以看成是一個(gè)可以存儲(chǔ)多個(gè)數(shù)據(jù)的容器。一次只能生成一個(gè)數(shù)據(jù),從前往后,不能逆向取,不能跳躍
b. 獲取生成器里面的數(shù)據(jù),需要使用 _next_( )方法
c. 只要函數(shù)聲明中有 yield 關(guān)鍵字,就表明這個(gè)函數(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

            # print(current)
            continue
        current = pre_1 + pre_2
        pre_1, pre_2 = pre_2, current
        # print(current)
        yield current




二、類和對(duì)象

1.定義

  • 類:對(duì)擁有相同功能和屬性的對(duì)象的封裝
  • 對(duì)象:類的實(shí)例


2.聲明

  • 類的聲明:
類的聲明:
class 類名(父類):
    屬性
    方法
解說

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

實(shí)例:
 1.聲明類Person
class Person:
    """類的說明:人類"""

    # 聲明兩個(gè)對(duì)象方法,需要使用對(duì)象來調(diào)用
    """
    對(duì)象方法默認(rèn)都有一個(gè)參數(shù)self,在調(diào)用方法的時(shí)候,這個(gè)參數(shù)不用傳參(系統(tǒng)會(huì)自動(dòng)給self傳參)
    誰來調(diào)用這個(gè)方法,self就是誰
    """
    def eat(self):
        print('self:', self)
        print('在吃飯')

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


  • 對(duì)象的聲明
聲明對(duì)象:

通過類的構(gòu)造方法去創(chuàng)建對(duì)象(名字和類名同名的方法就是構(gòu)造方法,自動(dòng)生成的)
對(duì)象名 = 類名()

類對(duì)象可以通過點(diǎn)語法使用類中聲明的對(duì)象的方法和屬性
對(duì)象.方法名()
對(duì)象.屬性名

實(shí)例
# 1.聲明類Person
class Person:
    """類的說明:人類"""

    # 聲明兩個(gè)對(duì)象方法,需要使用對(duì)象來調(diào)用
    """
    對(duì)象方法默認(rèn)都有一個(gè)參數(shù)self,在調(diào)用方法的時(shí)候,這個(gè)參數(shù)不用傳參(系統(tǒng)會(huì)自動(dòng)給self傳參)
    誰來調(diào)用這個(gè)方法,self就是誰
    """
    def eat(self):
        print('self:', self)
        print('在吃飯')

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



# 2. 聲明對(duì)象
p1 = Person()
print('p1:',p1)

# 一個(gè)類可以有多個(gè)對(duì)象
p2 = Person()
print('p2:',p2)

# 對(duì)象可以調(diào)用對(duì)象方法
p1.eat()
p2.eat()
p1.sleep()
p2.sleep()


3.對(duì)象屬性的聲明

對(duì)象屬性的聲明
class 類名:
    def __init__(self):
        self.屬性名 = 初值
        self.屬性名2 = 初值2
實(shí)例
class Person:
    """人類"""
    """
    1.init方法是系統(tǒng)自帶的一個(gè)方法,這個(gè)方法不能直接調(diào)用,通過類創(chuàng)建對(duì)象的時(shí)候系統(tǒng)會(huì)自動(dòng)調(diào)用這個(gè)方法
    init方法的作用是對(duì)對(duì)象的屬性進(jìn)行初始化
    2.通過構(gòu)造方法創(chuàng)建對(duì)象的時(shí)候,一定要保證,init方法中除了self以外,其他的每個(gè)參數(shù)都必須有值
    """
    def __init__(self, name1='', age1=0, sex='女'):
        # 在這個(gè)地方聲明對(duì)象的屬性
        # 在init方法中聲明對(duì)象的屬性
        """
        name、age和sex就是Person這個(gè)類的對(duì)象屬性。類的對(duì)象屬性,需要通過對(duì)象來使用
        """
        self.name = name1
        self.age = age1
        self.sex = sex

    def run(self, n):
        print(self.name)
        print(n)



# 注意:構(gòu)造方法中的參數(shù),實(shí)質(zhì)是傳給init方法的參數(shù)的
p1 = Person('yuting', 18)

p1.run(100)

# 通過對(duì)象使用對(duì)象屬性
print(p1.name, p1.age, p1.sex)

p2 = Person('女神', 30)
print(p2.sex, p2.name)

"""通過不同的方式創(chuàng)建對(duì)象"""
# 創(chuàng)建對(duì)象的時(shí)候不給屬性賦值
p3 = Person()

p4 = Person('')


4.增刪改查

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



dog1 = Dog(3,'white')


# 1.查(獲取屬性)
"""
方法一:對(duì)象.屬性 (如果屬性不存在,會(huì)報(bào)錯(cuò))
方法二:對(duì)象.__getattribute__(屬性名) 和 getattr(對(duì)象, 屬性名, 默認(rèn)值)
"""
print(dog1.age, dog1.color)

print(dog1.__getattribute__('age'))
print(getattr(dog1, 'age'))

# 如果設(shè)置了default的值,那么當(dāng)屬性不存在的時(shí)候不會(huì)報(bào)錯(cuò),并且返回默認(rèn)值
print(getattr(dog1, 'abc', '無名氏'))

# 2.改(修改屬性的值)
"""
方法一: 對(duì)象.屬性 = 新值
方法二:對(duì)象.__setattr__(屬性名,新值) 和  setattr(對(duì)象,屬性名,新值)
"""
dog1.age = 4
print(dog1.age)

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

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



# 3.增加(增加對(duì)象屬性)
"""
對(duì)象.屬性 = 值(屬性不存在)
注意:屬性是添加給對(duì)象的,而不是類的
"""
dog1.name = '大黃'
print(dog1.name)

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

setattr(dog1,'sex', '公')
print(dog1.sex)

# dog2 = Dog()
# print(dog2.name)

# 4.刪(刪除對(duì)象的屬性)
"""
方法一: del 對(duì)象.屬性

注意:刪除屬性也是刪的具體某個(gè)對(duì)象的屬性。不會(huì)影響這個(gè)類的其他對(duì)象
"""
# del dog1.age
# print(dog1.age)  # AttributeError: 'Dog' object has no attribute 'age'

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

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


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

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


stu1 = Student('小明', 30, '男')

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

stu1.tel = '123333'

stu1.age = 35

del stu1.sex

stu1.study()


5.類中的方法

  • 屬性

a.對(duì)象屬性: 屬于對(duì)象的,不同對(duì)象對(duì)應(yīng)的值可能不一樣(對(duì)象屬性,通過對(duì)象來使用)


b.類的字段: 聲明在類里面,函數(shù)外面。類的屬性屬于類(類的字段,通過類來使用)

  • 方法(對(duì)象方法(方法)、類方法、靜態(tài)函數(shù))

對(duì)象方法:自帶一個(gè)self參數(shù),一般要通過對(duì)象去調(diào)用


類方法:

1.使用@classmethod修飾
2.自帶一個(gè)cls參數(shù),并且這個(gè)參數(shù)不用傳參,誰來調(diào)用這個(gè)方法,cls就指向誰
3.類方法要通過類來調(diào)用



靜態(tài)方法:

1.使用@staticmethod修飾
2.沒有默認(rèn)參數(shù)
3.靜態(tài)方法要通過類來調(diào)用


  • 如何選擇方法:

  • 怎么選擇用對(duì)象方法、類方法、靜態(tài)方法?
    i如果實(shí)現(xiàn)函數(shù)的功能需要使用對(duì)象的屬性,就聲明成對(duì)象方法;

  • 如果實(shí)現(xiàn)函數(shù)的功能需要使用類的字段或者調(diào)用類的方法,就聲明成類方法

  • 如果實(shí)現(xiàn)函數(shù)功能既不需要對(duì)象的屬性也不需要類的字段,就聲明成靜態(tài)方法





易竹小居士.jpg

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容