day13總結(jié)

1.class類

1.三種編程思想

1.面向過(guò)程編程 -- 算法
2.函數(shù)式編程 -- 函數(shù)/模塊
3.面向?qū)ο缶幊? -- 類和對(duì)象

2.什么是類、什么是對(duì)象
  1. 官方定義
    類就是擁有相等功能和相同的屬性的對(duì)象的集合 -- 抽象的
    對(duì)象就是類的實(shí)例 -- 具體
  2. 生活角度看類和對(duì)象
    如果人是類,余婷就是對(duì)象、駱昊也是對(duì)象
    如果電腦是類,我桌上的這兩臺(tái)電腦就是對(duì)象
3.類的聲明
  1. 語(yǔ)法
    class 類名:
    類的內(nèi)容
  2. 說(shuō)明
    class - 聲明類的關(guān)鍵字
    類名 - 標(biāo)識(shí)符,不能是關(guān)鍵字
    見(jiàn)名知義,采用駝峰式命名(采用通過(guò)單詞首字母大寫(xiě)的方式來(lái)區(qū)分不同的單詞),首字母大寫(xiě)
    : - 固定寫(xiě)法
    類的內(nèi)容 - 主要包含: 類的說(shuō)明文檔、屬性(普通的變量)、功能(函數(shù)/方法)
4.對(duì)象怎么聲明

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

5.類中的方法
  1. 什么是方法:聲明在類中的函數(shù)就叫方法
  2. 類中的方法有三種:對(duì)象方法、類方法、靜態(tài)方法
    • a. 對(duì)象方法: 直接聲明在類中的函數(shù)
      有默認(rèn)參數(shù)self,通過(guò)對(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都能做)
      通過(guò)類的對(duì)象來(lái)調(diào)用: 對(duì)象.對(duì)象方法()

    • b.類方法: 聲明函數(shù)前加@classmethod
      有默認(rèn)參數(shù)cls, 通過(guò)類調(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都能做)
      通過(guò)類來(lái)調(diào)用: 類.類方法()

    • c.靜態(tài)方法:聲明函數(shù)前加@staticmethod
      沒(méi)有默認(rèn)參數(shù)
      通過(guò)類來(lái)調(diào)用: 類.靜態(tài)方法()

# 聲明一個(gè)Person類
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
        # 通過(guò)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()
6.什么是init方法

init是類默認(rèn)繼承的一個(gè)魔法方法,用來(lái)初始化類; 本質(zhì)是對(duì)象方法,但是不需要程序員自己調(diào)用,會(huì)被自動(dòng)調(diào)用。
通過(guò)類創(chuàng)建對(duì)象的時(shí)候(通過(guò)構(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)存中開(kā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)

7.屬性
  • 類中的屬性分為:對(duì)象屬性和字段
  1. 字段: 直接聲明在類中變量就是字段;
    字段要通過(guò)'類.字段'的方式來(lái)使用;
    當(dāng)屬性的值不會(huì)因?yàn)閷?duì)象不同而不同,這種屬性就可以聲明成類的字段
  2. 對(duì)象屬性: 在init方法中,以'self.屬性 = 值'的形式聲明;
    對(duì)象屬性要通過(guò)'對(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')


# 寫(xiě)一個(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())
8.聲明類的時(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)方法

9. 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)值。沒(méi)有默認(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)系作者
【社區(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫(xiě)文章,發(fā)現(xiàn)簡(jiǎn)書(shū)還為我保存起的...
    Jenaral閱讀 3,115評(píng)論 2 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,621評(píng)論 1 32
  • 1.迭代器和生成器 迭代器,獲取數(shù)據(jù):next(迭代器)、for循環(huán)遍歷,數(shù)據(jù)來(lái)源:轉(zhuǎn)換、生成器 生成器:就是迭代...
    Sun_092b閱讀 73評(píng)論 0 0
  • 補(bǔ)充 三目運(yùn)算符: 值1 if 表達(dá)式 else 值2 :如果表達(dá)式為T(mén)rue,整個(gè)表達(dá)式的值為值1,否則為值2...
    灬小魚(yú)兒zzZ閱讀 193評(píng)論 0 0
  • 01.recode 一.json數(shù)據(jù) 1.json數(shù)據(jù):a.只有一個(gè)數(shù)據(jù) b.數(shù)據(jù)類型是json支持的類型 2....
    Gary134閱讀 364評(píng)論 0 0

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