day13、day14-總結(jié)

recode

1.迭代器和生成器

迭代器,獲取數(shù)據(jù):next(迭代器),for循環(huán)遍歷;數(shù)據(jù)來源:轉(zhuǎn)換,生成器
生成器:就是迭代器,

"""
def 函數(shù)名():
    yield 值

生成式:
(表達式 for 變量 in 序列 if 條件語句)
"""
# 補充:三目運算符
"""
C語言中的三目運算符:表達式?值1:zhi2   --  判斷表達式的值是否為真,如果是整個運算的結(jié)果是值1,否則是值2
python的三目運算操作:值1  if 表達式 else 值2
"""
num = 10
result = '偶數(shù)' if num % 2 == 0 else '奇數(shù)'
print(result)

2.模塊

  • 模塊就是py文件
  • import 模塊名
  • 倒入模塊中所有的內(nèi)容
 from math import *
if __name__ == '__main__':
    pass
`
包/庫就是文件夾


# 3.異常處理
```python
"""
try:
    需要捕獲的異常的代碼段
except:
    出現(xiàn)異常后對異常的處理代碼段
finally:
    不管try后的代碼是否異常,異常是否被捕獲第都執(zhí)行代碼

"""

類和對象

1.什么是類,什么是對象

"""
1)官方定義:類就是擁有相同功能和相同屬性的對象的集合   --  抽象
           對象就是類的實例                           --  具體
2)生活角度看類和對象
如果人是類,余婷就是對象,駱昊也是對象
如果電腦是類,對象就是具體到一臺電腦,比如我桌子上的電腦
"""

2.類的聲明

"""
1)語法
class 類名:
    類的內(nèi)容
2)說明
class - 固定寫法聲明類的關(guān)鍵字
類名  - 標識符,不能是關(guān)鍵字,
        見名知意,才用駝峰式命名(通過單詞首字母大寫的方式來區(qū)分不同的單詞),首字母大寫
 :    - 固定寫法
類的內(nèi)容  -   主要包含:類的說明文檔,類的屬性(普通的變量),類的功能(函數(shù):寫在類里面也叫方法)
"""

3.對象怎么聲明

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

"""

4.類中的方法

"""
1)什么是方法:聲明在類中的函數(shù)就叫方法
2)類中的方法有三種:對象方法,類方法,靜態(tài)方法
a.對象方法:直接聲明在類中的函數(shù)
           有默認參數(shù)self,通過對象調(diào)用的時候這個參數(shù)不用傳參,因為系統(tǒng)會自動將當前對象傳遞給self
           (self,當前對象 - 誰調(diào)用self就指向誰,當前類的對象嫩做的事情self都能做)
           通過類的對象來調(diào)用: 對象.對象方法()
b.類方法: 聲明函數(shù)前加@classmethod
          有默認參數(shù)cls,通過類調(diào)用的時候這個參數(shù)不用傳參
          (cls,當前類 - 誰調(diào)用就指向誰)
          通過類來調(diào)用:類.類方法
c.靜態(tài)方法: 聲明函數(shù)前加@staticmethod
            沒有默認參數(shù)
            通過類來調(diào)用:類.靜態(tài)方法
"""

# 聲明一個Person類


class Person:
    """說明文檔"""
    # =======屬性=======
    # =======方法=======
    def eat(self, food):
        # self = p1  food =  '串串'
        print(p1, self)   # 打印 p1 和 self 的 內(nèi)存地址
        print('吃'+food)
        self.study('python')

    def study(self, type1):
        print('學習', type1)
#  ==============類方法============

    @classmethod
    def destroy(cls):
        tp = cls
        print('人類破壞環(huán)境')
        print('cls:', cls)
        print('tp:', tp)
#  ==============靜態(tài)方法============

    @staticmethod
    def beat_animal():
        print('喜歡貓')


# 創(chuàng)建Person類的對象p1
p1 = Person()
p1.eat('串串')
p1.study('數(shù)學')
Person.destroy()
print(Person)
Person.beat_animal()

常識:

1.什么是init方法

init是類名默認繼承的一個魔法方法,用來初始化類; 本質(zhì)是對象方法,但是會不需要程序員自己調(diào)用,會被自動調(diào)用

通過類創(chuàng)建對象的時候(通過構(gòu)造方法創(chuàng)建對象),系統(tǒng)會自動調(diào)用類中的init方法,并且構(gòu)造方法中單實參會全部傳給init方法

創(chuàng)建對象的時候需不需要參數(shù),需要幾個參數(shù),看這個類的init方法

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


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


p1 = Person()   # 開辟

類的屬性

1.屬性

"""
類中的屬性分為:對象屬性和字段
1) 字段 : 直接聲明在類中的變量就是字段 ; 字段要通過'類.字段'的方式來使用;
          當屬性的值不會因為對象不同而不同,這種屬性就可以聲明成類的字段
2)對象屬性 : 必須聲明在__init__方法中以'self.屬性 = 值'的形式聲明;
             通過對象要通過'對象.屬性'的方式來使用
             當屬性的值會因為對象不同而不同,使用對象屬性
"""


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

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


print(Dog.numbers)
dog1 = Dog('黃狗')
print(dog1.age, dog1.color, dog1.gender)

# 寫一個矩形類,有屬性:長和寬    方法:求面積,求周長


class Rectangle:
    def __init__(self, long: int, width: int):
        self.long = long
        self.width = width

    def rect(self):
        s = self.long*self.width
        l = (self.long+self.width)*2
        return s, l


p2 = Rectangle(2, 2)
print(p2.rect())

# 聲明一個學生類,擁有屬性:名字,電話.年齡,學號.擁有功能:學習(打印XX在學XX),打游戲


class Student:
    def __init__(self, names, telephone, ages, numbers):
        self.name = names
        self.tpl =telephone
        self.age = ages
        self.num = numbers

    def study(self, subject='英語'):
        print(self.name+'在學'+subject)


p1 = Student('王子', 123, 12, '001')
p1.study('數(shù)學')

2.聲明類的時候方法的選擇

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

對象屬性相關(guān)

python中的對象屬性支持增,刪,改,查
!!!注意:對象屬性的增刪改查只針對單個對象


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


dog1 = Dog('大黃')
dog2 = Dog('才才')

1.查

"""
a.對象.屬性  - 獲取指定屬性對應(yīng)的值,如果屬性不存在會報錯
b.getattr(對象, 屬性名, 默認值)   -  獲取指定對象指定屬性對應(yīng)的值;
                                     當屬性不存在有默認值的時候不報錯,返回默認值.沒有默認值的時候報錯
"""
print(dog1.name)
print(getattr(dog1, 'name2', 100))

2.增,改

"""
a.對象.屬性 = 值     -   當屬性不存在就添加屬性,當屬性存在修改屬性的值
b.setattr(對象,屬性名,值)  -  當屬性不存在就添加屬性,當屬性存在修改屬性的值
"""
# a.
dog1.gender = '公'
print(dog1.gender)
dog1.name = '貝貝'
print(dog1.name)
# b.
setattr(dog1, 'category', '二哈')
a_name = 'color'
setattr(dog1, a_name, '白色')
print(dog1.category, dog1.color)

3.刪除

"""
a.del 對象.屬性
b.delattr(對象,屬性名)
"""
del dog1.name
# print(dog1.name)     #AttributeError:
delattr(dog1, 'age')
# print(dog1.'age')    #AttributeError:

Day14_recode

1.類的聲明

類是擁有相同屬性和相同功能的對象的集合

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

2.創(chuàng)建對象

對象 = 類()

3.(重點!)類中的內(nèi)容:對象方法.類方法,靜態(tài)方法;字段,對象屬性

"""
1)方法 - 怎么聲明,特點,怎么調(diào)用,什么時候用
對象方法:直接聲明在類中的函數(shù);
         有默認參數(shù)self;
         通過對象調(diào)用;
         實現(xiàn)功能需要用到對象屬性的時候
類方法:聲明前加@classmethod;
       有默認參數(shù)cls;
       通過類調(diào)用;
       實現(xiàn)函數(shù)功能在不需要對象屬性,需要類相關(guān)操作的時候
靜態(tài)方法:聲明前加@staticmethod,
         沒有默認參數(shù),和普通函數(shù)差不多;
         通過類調(diào)用;
         既不需要對象屬性,也不需要對象操作

2)屬性 -  怎么聲明,怎么使用,什么時候用
字段:聲明在類里面,函數(shù)外面;
    通過類來使用
    不會因為對象不同而不同的屬性聲明成字段
對象屬性:以'self.屬性 = 值'的形式聲明在__init__方法中;
         通過對象使用
         會因為對象不同而不同的屬性聲明成字段
"""

4.對象屬性的增刪改查

"""
1)查
對象.屬性  -  沒對應(yīng)屬性會報錯
getattr(對象,屬性,默認值)  -   當沒有對應(yīng)屬性的時候返回默認值
2)增改
對象.屬性 = 值
setattr(對象,屬性,值)
3)刪
del 對象.屬性
delattr(對象,屬性)

"""

內(nèi)置類屬性

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

創(chuàng)建類的時候,系統(tǒng)默認為我們添加的類的屬性

class Person:
    """人類"""
    # 類的字段
    number = 61
    # 對象屬性

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

    def object_func(self):
        print('對象方法:'+self.name)

    @classmethod
    def class_func(cls):
        print('類方法:', cls.number)

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

    # 系統(tǒng)自帶的魔法方法,可以定制當前類的對象的打印內(nèi)容.實現(xiàn)這個函數(shù)的時候要求有一個字符串類型的返回值
    # 影響單獨打印對象的效果
    def __str__(self):
        # return str(self.__dict__)[1:-1]
        return 'abc'

    # 對象作為元素的時候的打印效果
    def __repr__(self):
        return str(self.__dict__)
        # return '132'


p1 = Person('小明', 18, '男')
p2 = Person('小花', 19, '女')
# 1.__name__ 字段
"""
類.__name__ -  獲取類的名字
"""
print(Person)
print(Person.__name__, type(Person.__name__))

# 2.__doc__ 字段
"""
類.__doc__  -  獲取類的說明文檔
"""
print(Person.__doc__)

# 3.__class__  對象屬性
"""
對象.__class__  -  獲取對象對應(yīng)的類(你這個對象是那個類的對象)
"""
print(p1.__class__)

# 4.__dict__  字段和對象屬性都可以
"""
類.__dict__  -  獲取類中所有的字段和對應(yīng)的值以字典返回
對象.__dict__  -  獲取對象中所有的對象屬性和對應(yīng)的值以字典返回
"""
print(Person.__dict__)
print(p1.__dict__)

# 5.__module__  字段
"""
類.__module__   -  獲取指定類聲明在那個模塊中,返回模塊名(獲取所在模塊的__name__的屬性的值)
"""
print(Person.__module__)

# 6.__bases__  字段
"""
lei.__bases__   -  返回當前類所有的父類
"""
print(Person.__bases__)


print('p1', p1)
print([p1, p2, Person('小紅')])

2.slots魔法

**與dict沖突使用時注意

"""
可以通過給__slots__字段賦值約束當前類有那些對象屬性,只約束增加不約束刪除
當在類中給__slots__賦值后,當前類的對象的__dict__屬性無效
"""


class Dog:
    __slots__ = ('name', 'age')

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


dog = Dog('大黃')
# dog.name1 = '小白'
# print(dog.__dict__)

屬性保護和私有化

"""

1.高級語言

在很多的高級面對對象語音中,會將屬性和方法分為
a.公開的(在類的外部可以使用),
b.私有的(只能在類的內(nèi)部使用,不能被繼承),
c.受保護(只能在類的內(nèi)部使用,可以被繼承)

2.python

python中類的內(nèi)容本質(zhì)上全部都是公開的.私有和公開都只是約到
1)私有化 -  a.內(nèi)容只能在類的內(nèi)部使用,不能在外面使用.(效果)
          b.在類中的方法名或者屬性名前加'__'那么對于的屬性和方法就會變成私有的(怎么私有化)
          c.當聲明類的時候在名字前加'__',內(nèi)部會在這個基礎(chǔ)上下再加'_類名'    (私有化的本質(zhì))
2)屬性保護  -  可通過在對象屬性名前'_',吧這個屬性標記成受保護類型;為了告訴別人這個屬性在使用的時候,
               不要直接用,而是通過getter和setter來使用  (怎么保護)
a.getter - 獲取對象屬性值之前想要干點別的事情,那么就給這個屬性添加getter
第一步:在對應(yīng)的屬性名前加'_'
第二步:在@property聲明一個函數(shù),這個函數(shù)沒有參數(shù),有一個返回值,并且函數(shù)名是屬性名去掉'_'
第三步:獲取屬性值的時候,通過對象.屬性名去掉下劃線去獲取屬性的值
b.setter - 給屬性賦值前干點別的事情,就給這個屬性添加setter.(想要添加setter必須先有g(shù)etter)
第一步:在對應(yīng)的屬性名前加'_'
第二步:在@getter名.setter后面聲明一個函數(shù),這個函數(shù)需要一個參數(shù),沒有返回值,并且函數(shù)名是屬性去掉'_'
第三步:給屬性賦值的時候,,通過'對象.屬性名去掉下劃線 = 值'去賦值

3.拋出異常:

a.語法
raise 異常類型

b.說明:
raise - 關(guān)鍵字
異常類型 - 可以是系統(tǒng)提供的異常類型,也可以是自定義的異常類型(必須繼承Exception)

4.自定義異常類型:寫一個類繼承Exception,然后重寫str方法來自定義錯誤信息.

"""


class WeekValueError(Exception):
    def __str__(self):
        return '星期的值只能是1-7的整數(shù)'


class AgeError(Exception):
    def __str__(self):
        return '年齡要求是整數(shù)并且只能在0-150之間'


# raise WeekValueError


# =============保護=============
class Person1:
    def __init__(self):
        self._age = 0
        self._week = 6

    @property
    def week(self):
        weeks = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
        return weeks[self._week-1]

    @week.setter
    def week(self, x):
        if not isinstance(x, int):
            raise ValueError
        elif not 1 <= x <= 7:
            raise ValueError
        self._week = x

    @property
    def age(self):
        if self._age < 18:
            return str(self._age)+'歲', '未成年'
        else:
            return str(self._age)+'歲', '成年'

    @age.setter
    def age(self, x):
        if not isinstance(x, int):
            raise AgeError
        elif not 150 >= x >= 0:
            raise AgeError
        self._age = x


p1 = Person1()
p1.age = 16
print(p1.age)
# p1.age = 'abc'
print(p1.week)
p1.week = 4     # 本質(zhì)是在調(diào)用setter
print(p1.week)  # 本質(zhì)實在調(diào)用getter
# 練習:給age屬性添加getter和 setter,獲取年齡的時候拿到年齡值,和這個年齡對應(yīng)的階段;
# 給age賦值的時候,必須是整數(shù),并且范圍在0-150.如果不滿女主要求求報錯AgeError,并且定義提示信息


# =============私有化===========
class Person:
    def __init__(self, name, age=0):
        self.name = name
        self.__age = age

    def message(self):
        print(self.__age)


p = Person('小明')
print(p.name)
# print(p.__age)
p.message()

繼承

1.什么是繼承:讓子類直接擁有父類的所有的屬性和方法

父類 - 被繼承中,子類 - 繼承者
python所有的類都是直接或者間接繼承object

2.怎么繼承

"""
class 子類(父類列表):
    類的內(nèi)容
"""

3.子類添加內(nèi)容

1)字段和方法,直接添加
2)對象屬性的添加

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

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

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