2019-01-11

Day15

一、 編程思想

1、 面向過程編程

遇到問題直接將邏輯轉(zhuǎn)換成代碼;邏輯思維,算法

2、 函數(shù)式編程

遇到問題就想找一個或?qū)懸粋€擁有相應(yīng)功能的函數(shù);以函數(shù)作用工具

3、 面向?qū)ο缶幊?/h4>

遇到問題就考慮可以不可以有一個類來給我提供相應(yīng)的功能和數(shù)據(jù);以類和對象為工具

python既支持函數(shù)式編程也支持面向?qū)ο缶幊?/p>

二、認識類和對象

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

類就是擁有相同功能和相同屬性的對象的集合;類是抽象的
對象就是類的實例;對象是具體的

2、 類的聲明

類中的內(nèi)容包含功能(函數(shù))和屬性(變量/屬性)

a. 語法

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

b. 說明

class - python聲明類的關(guān)鍵字
類名 - 要求:標識符,不能是關(guān)鍵字
規(guī)范:駝峰式命名(通過首字母大寫來區(qū)分不同的單詞)
: - 固定寫法
類的內(nèi)容 - 包含類的方法、屬性和說明文檔
方法就是聲明在類中的函數(shù)
屬性就是聲明在類中的變量

3、 對象的聲明

語法:
類名() - 創(chuàng)建指定的類的對象并且返回

class Person:
    """類的說明文檔:人類"""
    num = 61 # 類中的屬性

    # 類中的方法
    def eat(self):
        print('吃飯')

def main():
    # 創(chuàng)建Person類的對象;p1就是對象
    p1 = Person()
    print(p1)
    p2 =Person()
    print(p2)
    p3 = p2
    print(p3)

if __name__ == '__main__':
    main()

三、 對象方法

class 類名:
類中的屬性
類中的方法

1、 類中的方法

聲明在類中的函數(shù)就是方法
類中的方法包括:對象方法(實例方法),類方法,靜態(tài)方法

a. 對象方法

直接聲明在類中的方法就是對象方法
有默認參數(shù)self
通過 ‘對象.’的方式來調(diào)用(對象方法要通過對象來調(diào)用)
當我們通過對象調(diào)用對象方法的時候,self不需要傳參;因為系統(tǒng)會自動將當前對象傳遞給self
當前對象:調(diào)用當前方法的對象(誰調(diào)用對象方法self就是誰)
注意:當前類的對象能做的事情,self都可以做

class Person:
    def run(self):
        print('人在跑步')
    def eat(self,food):
        print(food)
p1 = Person()
print(p1.run())
p1.eat('包子')

2、 init方法:init

init方法是類中的一個特殊對象方法,專門用來對象創(chuàng)建的對象進行初始化。
當通過類創(chuàng)建對象的時候,系統(tǒng)就會自動調(diào)用init方法

3、 構(gòu)造方法

函數(shù)名和類名一樣的函數(shù)就是構(gòu)造方法,專門用來創(chuàng)建對象
python中聲明類的時候系統(tǒng)會自動創(chuàng)建這個類對應(yīng)的構(gòu)造方法
當我們構(gòu)造方法的時候,內(nèi)部現(xiàn)在內(nèi)存中開辟空間保存對象,然后用創(chuàng)建的這個對象去調(diào)用init方法,用來對對象初始化
init方法調(diào)用結(jié)束,返回對象。
def Person():
對象 = 創(chuàng)建對象
對象.init():
return 對象


class Person:
    # 類中以“__”開頭結(jié)尾的方法叫魔法方法。不需要主動調(diào)用,系統(tǒng)會自動調(diào)用
    def __init__(self):
        print('init被調(diào)用了')

p1 = Person()

四、對象屬性

1、 什么是對象屬性

類中的屬性分為累的字段和對象屬性

a. 對象屬性

屬性的值會因為對象不同而不一樣,這種屬性就應(yīng)該聲明為對象屬性
聲明在init方法中 - 位置
以'self.屬性 = 值'的方式來聲明(這兒的屬性就是對象屬性) - 方式
通過'對象.屬性'的方式來使用 - 使用
b. 類的字段 - 屬性的值不會因為對象不同而不同,這種屬性就聲明成類的字段
直接聲明在類的里面,函數(shù)外面的變量就是類的字段
以'字段名=值'
通過'類.字段'的方式來使用



class Person():
    def __init__(self, name='年齡', age=0):
        self.name = name
        self.age = age


p1 = Person('張三', 18)
# 獲取對象屬性的值
print(p1.name, p1.age)
 練習:創(chuàng)建Dog類,有屬性名字、類型、年齡
要求創(chuàng)建Dog的對象的時候不能給年齡賦值,可以給類型賦值也可以不用給類型賦值,必須給名字賦值
# 對象方法eat:打印xxx在吃什么
class Dog():
    def __init__(self, name, type1='金毛'):
        self.name = name
        self.type = type1
        self.age = 10

    def eat(self):
        print(self.name + '吃')


print(Dog('wg').eat())

練習:聲明矩形類,擁有屬性長和款,擁有方法求面積和求周長
class retangle:
    def __init__(self, chang=0, kuan=0):
        self.chang = chang
        self.kuan = kuan

    def s(self):
        s = self.chang * self.kuan
        return '長%.3f,寬%.3f的面積是%.3f' % (self.chang, self.kuan, s)

    def c(self):
        c = (self.chang + self.kuan) * 2
        return '長%.3f,寬%.3f的周長是%.3f' % (self.chang, self.kuan, c)


r = retangle(10,20)
print(r.s()+'\n'+r.c())
# 使用類的字段
r.kuan = 100
r.chang = 200

五、 對象屬性的增刪查改

python中對象的屬性支持增刪改查

1、 查(獲取對象屬性)



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

class Dog:
    # 約束當前類的對象最多能擁有的哪些屬性
    #__slots__ = ('name', 'color')
    def __init__(self,name='',color='黑色'):
        self.name = name
        self.color = color
def main():
    dog1 = Dog('WG', '黃色‘')

    p1 = Person('小花')
    p2 = Person('wg')

查(獲取對象屬性)

對象.屬性 - 獲取指定對象指定屬性值
getattr(對象,屬性名:str,默認值) - 獲取對象指定屬性值
                                  當默認值賦了值且屬性不存在的時候,程序不會報錯,并且將默認值作為結(jié)果 
    print(p1.name)
    print(getattr(p1,'name'))
    print(getattr(p1,'name1',None))

增/改
對象.屬性 = 值 - 當屬性存在的時候是修改屬性的值,不存在就增加屬性和值

    # 修改屬性
    p1.name ='xoiaohua'
    print(p1.name)
    # 添加屬性
    p1.height = 180
    print(p1.height)
    setattr(p1,'age',19)
    print(p1.age)
    setattr(p1,'weight',200)
    print(p1.weight)

    del 對象.屬性
    delattr(對象,屬性名)
    """
    print('=================')
    del p1.sex
    delattr(p1,'age')

    # 注意:對象屬性的操作,只針對操作的那一個對象
    print(p1.height)




if __name__ == '__main__':
    main()

五、 內(nèi)置方法

內(nèi)置屬性指的是我們創(chuàng)建類的時候,系統(tǒng)自動給我們添加的屬性(其實是通過繼承獲取到的)

class Person:
    # 類的字段
    num = 61
   # __slots__ = ('name', 'age', 'sex')
    # 對象屬性
    def __init__(self, name='', age=0, sex='男'):
        self.name = name
        self.age = age
        self.sex = sex

    def eat(self, food):
        print('')

定制對象的打印格式(當我們通過打印print打印一個對象的時候,實質(zhì)就是打印對象調(diào)用一個reor函數(shù)的返回值)
這個函數(shù)的返回值必須是字符串

    def __repr__(self):
        #return '<%s.%s object at %s>' % (self.__class__.__module__, self.__class__.__name__, hex((id(self))))
        return '<' + str(self.__dict__)[1:-1] + 'at' + hex(id(self)) + '>'
def main():
    # 1. __name__
    """
    獲取類名:
    """
    p1 = Person()
    persons = []
    print(Person.__name__)
    # 2 類.__class__ - 獲取對象對應(yīng)的類(結(jié)果是類)
    print(Person.__class__)
    # 3.類.__doc__ - 獲取說明文檔
    print(Person.__doc__)
    # 4. 對象.__dict__  -  將對象轉(zhuǎn)換成字典,將屬性和值作為字典的鍵值對
    print(p1.__dict__)
    # 5. 類.__module__             -      獲取當前類所在的模塊的模塊名
    print(Person.__module__)
    # 6. 類.__bases__              -      獲取當前類的父類(元組)
    print(Person.__bases__)
    print(p1)


if __name__ == '__main__':
    main()

六、 類方法和內(nèi)置方法

1、對象方法:

a. 聲明:直接聲明在類里
b. 特點:自帶self參數(shù),調(diào)用的時候不用傳參,誰調(diào)用指向誰
c. 調(diào)用:對象.方法()

2、類方法:

a. 聲明:聲明函數(shù)前加@classmethod
b. 特點:自帶默認參數(shù)cls;調(diào)用的而不用傳參,系統(tǒng)自動調(diào)用當前函數(shù)的類傳給它
     (cls是誰調(diào)用就指向誰)
c. 調(diào)用: 通過類來調(diào)用,類.方法()

3、 靜態(tài)方法

a. 聲明:聲明函數(shù)前加@staticmethod
b. 特點:沒有默認參數(shù)
c. 調(diào)用:通過類來調(diào)用,類.方法()

4、 在類中怎么選擇的使用哪種方法

如果實現(xiàn)類中的函數(shù)的功能需要使用對象的屬性,那么這個函數(shù)就要聲明對象方法。
實現(xiàn)函數(shù)的功能不需要對象屬性的前提下,如果需要類的字段,就聲明成類方法。
實現(xiàn)函數(shù)的功能既不需要對象屬性也不需要類的字段就聲明成靜態(tài)方法。



class Person:
    num = 60

    @classmethod
    def func1(cls):
        # 類能做的,cls都能做
        p1 = cls()  # 用cls來創(chuàng)建對象
        print(p1)
        print('這是一個類方法')
        cls.num = 100  # 用cls來使用類的字段
        cls.func2()  # 用cls來調(diào)用方法
        print(cls.num)

    @staticmethod
    def func2():
        print('我是靜態(tài)方法')


def main():
    Person.func1()


if __name__ == '__main__':
    main()
?著作權(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)容