day14-總結(jié)

"""author = Zard"""

1.編程思想

1)面向過程編程:算法和邏輯
2)面向?qū)ο缶幊蹋侯惡蛯?duì)象 -- 面向生活編程
3)函數(shù)式編程:

2.類和對(duì)象

1.什么是類,什么是對(duì)象

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

如果說人是一個(gè)類,駱昊就是一個(gè)對(duì)象,小明是另一個(gè)對(duì)象
如果說整數(shù)是一個(gè)類,100是一個(gè)對(duì)象,3是另外一個(gè)對(duì)象

2.類的聲明

1)語(yǔ)法
class 類名:
類的內(nèi)容
2)說明
class -- 關(guān)鍵字
類名 -- 程序員自己命名:是標(biāo)識(shí)符但不能是關(guān)鍵字(要求):
采用駝峰式命名。并且首字母大寫
類的內(nèi)容 - 包含類的說明文檔、類中的函數(shù)(相同的功能)、類中的屬性(相同的屬性)

3.創(chuàng)建對(duì)象

1)語(yǔ)法
對(duì)象 = 類()

class Person:
    """類的說明文檔:人類"""
    def eat(self):
        print('吃飯')
# 創(chuàng)建Person類的對(duì)象
p1 = Person()
# 同一個(gè)類可以有多個(gè)對(duì)象
p2 = Person()

3.對(duì)象方法

1.類中的函數(shù)

聲明在類中的函數(shù)又叫 方法,類中的方法分為3種:對(duì)象方法、類方法、靜態(tài)方法
1)對(duì)象方法
直接聲明在類中的函數(shù),自帶一個(gè)self參數(shù)。
對(duì)象方法需要通過 '對(duì)象.函數(shù)名' 的方式來調(diào)用
通過對(duì)象調(diào)用對(duì)象方法的時(shí)候,self不需要傳參;系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self(誰(shuí)調(diào)用指向誰(shuí))
強(qiáng)調(diào):對(duì)象方法就用對(duì)象去調(diào)用,不要用類去調(diào)用對(duì)象方法

class Person:
    """類的說明文檔:人類"""
    def eat(self):
        print('吃飯')
p1 = Person()
p1.eat()
# Person.eat(100)   沒意義

4.init方法

1.什么是 init 方法

是類中的一個(gè)魔法方法,也是對(duì)象方法;在創(chuàng)建對(duì)象時(shí)會(huì)被自動(dòng)調(diào)用

2.構(gòu)造方法(了解)

-- 開辟空間創(chuàng)建對(duì)象
-- 使用創(chuàng)建好的對(duì)象調(diào)用init方法(做一些初始化操作)
-- 返回對(duì)象

注意:如果init方法中出了self以外還有其他的參數(shù),需要通過構(gòu)造方法來給init方法傳參
這兒person1()就是在調(diào)用構(gòu)造方法

class Person1:
   def __init__(self,x,y):
       print('init方法被調(diào)用',x,y)
# 當(dāng)然也可以用關(guān)鍵字參數(shù)傳參

5.類中的屬性

1.類中的屬性:對(duì)象屬性、字段
1)字段
a.怎么聲明:聲明在類的里面函數(shù)的外面的變量,就是類的字段
b.怎么使用:通過 "類.字段" 的方式去使用
c.什么時(shí)候用:屬性值不會(huì)因?yàn)閷?duì)象不同而不一樣,這樣的屬性就聲明成類的字段
2)對(duì)象屬性(重點(diǎn)) --
a.怎么聲明:以"self.屬性名 = 值" 的方式聲明在init方法中
b.怎么使用:通過"對(duì)象.屬性名"的方式去使用
c.什么時(shí)候用:屬性值會(huì)因?yàn)閷?duì)象不同而不一樣,這樣的屬性就聲明成對(duì)象屬性
三種賦值:1、直接設(shè)置參數(shù),傳參,2、直接設(shè)置初始值,不用傳參,3、設(shè)置參數(shù)默認(rèn)值

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

    def __init__(self):
        # 這兒的name、age、gender就是Person類的對(duì)象屬性
        self.name = ''
        self.age = 0
        self.gender = '男'

print(Person.num)    # 61
Person.num = 100
print(Person.num)    # 100

p1 = Person()
p1.name = '小明'

p2 = Person()
p2.name = '小花'

class Dog:
    def __init__(self,name1,age1,color1,breed1):
        self.name = name1
        self.age = age1
        self.color = color1
        self.breed = breed1

    # 返回值必須是字符串
    def __repr__(self):
        return str(self.__dict__)
dog1 = Dog('大黃',3,'黃色','小狼狗')
dog2 = Dog('小花',1,'黑色','金毛')
print(dog1.name,dog2.name)     # 大黃 小花

print(dog1) # <main.Dog object at 0x00000253F1640B38> 打印的是地址
需要重寫repr方法,來定制對(duì)象的打印格式(默認(rèn)對(duì)象地址)

重寫后:

{'name': '大黃', 'age': 3, 'color': '黃色', 'breed': '小狼狗'}
練習(xí):聲明一個(gè)矩形類,有屬性:長(zhǎng)和寬,功能:計(jì)算矩形的面積和周長(zhǎng)

class Rect_wyk:
    """矩形類"""
    def __init__(self,x,y):
        self.x = x
        self.y = y

    def area(self):
        return 2 * self.y + 2 * self.x

    def perim(self):
        return self.x * self.y

a = Rect_wyk(2,3)
print(a.area())
print(a.perim())

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

===1.對(duì)象屬性===
python中對(duì)象的屬性支持增刪改查操作
===2.查 -- 獲取對(duì)象屬性的值===

  1. 對(duì)象.屬性 - 獲取對(duì)象指定屬性的值,如果屬性不存在,報(bào)錯(cuò)!
  2. getattr(對(duì)象,屬性名) - 獲取對(duì)象指定屬性的值,如果屬性不存在,報(bào)錯(cuò)!
    getattr(對(duì)象,屬性名str,默認(rèn)值) - 獲取對(duì)象指定屬性的值,如果屬性不存在,不會(huì)報(bào)錯(cuò)而是返回默認(rèn)值。
    (當(dāng)屬性名通過別的方式得到時(shí),增刪改查要用attr方法)
    ===3.增、改 - 給對(duì)象添加屬性/修改對(duì)象屬性的值===
  3. 對(duì)象.屬性 = 值 --- 當(dāng)屬性不存在就給對(duì)象添加屬性,如果屬性存在就修改屬性的值
  4. setattr(對(duì)象,屬性名str,值) - 功能同上

===4.刪 --- 刪除對(duì)象屬性===

  1. del 對(duì)象.屬性
  2. delattr(對(duì)象,屬性名)

=========注意:屬性的增刪改查只針對(duì)當(dāng)前對(duì)象有效,不會(huì)作用于其他對(duì)象==========
"""

class Person:
    # 可以通過類的__slots__字段賦值,來約束當(dāng)前類的對(duì)象最多有哪些屬性值
    __slots__ = ('name','age','gender')

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


p1 = Person('小明',18)
p2 = Person('小花',20,'女')

print(p1.name)
print(getattr(p1,'name'))

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

1.什么是內(nèi)置類屬性
創(chuàng)建類的時(shí)候,系統(tǒng)自動(dòng)為這個(gè)類提供的屬性

class Person:
    """說明文檔:人類"""
    num = 61

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

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

    # 定制對(duì)象的打印
    def __repr__(self):
        return '<%s>' % str(self.__dict__)[1:-1]  # 一般用__repr__
        # return
    # 定制對(duì)象的打印
    # def __str__(self):
    #     return '<%s>' % str(self.__dict__)[1:-1] # 打印對(duì)象為序列時(shí),仍打印為地址,不常用
p1 = Person('Tom',18,'男')

1.name

類的字段,獲取類的名字
print(Person.name) # Person
print(Person) # <class 'main.Person'>

2.doc

類的字段,獲取類的說明文檔
print(Person.doc) # 說明文檔:人類

3.class

對(duì)象屬性,獲取對(duì)象對(duì)應(yīng)的
c1 = p1.class
print(c1) # <class 'main.Person'> 現(xiàn)在c1作用等同于Person

4.dict

1)類的字段,獲取類中的字段(用得少)
2)對(duì)象屬性,獲取對(duì)象的所有屬性和其對(duì)應(yīng)的值,以字典的形式返回(用得多)
注意:如果給類的slots的屬性賦了值,那么類的對(duì)象就不能使用
dict去獲取所有的屬性 (較多用dict
print(Person.dict) # {'module': 'main', 'doc': '說明文檔:人類', 'num': 61, 'init': <function Person.init at 0x000002242F943730>, 'eat': <function Person.eat at 0x000002242F9437B8>, 'dict': <attribute 'dict' of 'Person' objects>, 'weakref': <attribute 'weakref' of 'Person' objects>}

print(p1.dict) # {'name': 'Tom', 'age': 18, 'gender': '男'}

5.module

類的字段,獲取類所在的模塊(類是再哪個(gè)py文件中聲明的)返回的是模塊名
print(Person.module) # main
print(int.module) # builtins

6.bases

類的字段,獲取當(dāng)前類的父類
print(Person.bases) # (<class 'object'>,)

?著作權(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)容