Day15面向?qū)ο?/h1>

編程思想

1.面向過程編程 - 遇到問題直接將邏輯轉(zhuǎn)換成代碼; 邏輯思維颓影,算法
2.函數(shù)式編程 - 遇到問題就想找一個(gè)凹耙、寫一個(gè)擁有相應(yīng)功能的函數(shù); 以函數(shù)作用工具
3.面向?qū)ο缶幊?- 遇到問題就考慮可以不可以有一個(gè)類來給我提供相應(yīng)的功能和數(shù)據(jù); 以類和對象為工具
python既支持函數(shù)式編程也支持面向?qū)ο缶幊?/p>

import json
# json.load()

import datetime

print(datetime.datetime.today())


num1 = 34
num2 = 34
print(num1 + num2)


def sum1(num1, num2):
    return num1+num2


print(sum1(1, 23))
print(sum1(23, 45))




def sum2(n):
    sum1 = 0
    for x in range(n+1):
        sum1 += x
    return sum1

print(sum2(100))
print(sum2(50))

sum1 = 0
for x in range(51):
    sum1 += x
print(sum1)

def main():
    pass


if __name__ == '__main__':
    main()

認(rèn)識類與對象(聲明):

1.什么是類链嘀,什么是對象
類就是擁有相同功能和相同屬性的對象的集合; 類是抽象的
對象就是類的實(shí)例; 對象是具體的
人是類漂彤, 余婷就是人類的對象
車是類, 樓下停在...的那輛車就是對象
電腦是類友驮, 我桌上這臺黑色的電腦就是對象

2.類的聲明
類中的內(nèi)容包含功能(函數(shù))和屬性(變量/屬性)
a.語法
class 類名:
類的內(nèi)容

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

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

# 聲明一個(gè)人類
class Person:
    """類的說明文檔: 人類"""
    num = 61    # 類中的屬性

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


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

    # 同一個(gè)類可以創(chuàng)建多個(gè)對象
    p2 = Person()
    print(p2)

    p3 = p2
    print(p3)


if __name__ == '__main__':
    main()

對象方法:

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

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

2.對象方法:
a.什么是對象方法
直接聲明在類中的方法就是對象方法
有默認(rèn)參數(shù)self
通過'對象.方法()'的方式來調(diào)用(對象方法要通過對象來調(diào)用)

b.參數(shù)self
當(dāng)我們通過對象調(diào)用對象方法的時(shí)候蹬屹,self不需要傳參;因?yàn)橄到y(tǒng)會自動將當(dāng)前對象傳遞給self。
當(dāng)前對象:調(diào)用當(dāng)前方法的對象(誰調(diào)用對象方法self就是誰)
注意:當(dāng)前類的對象能做的事情self都能做

class Person:
    def run(self):
        # self=p1;
        # self = p1
        # self = p2
        print('self:', self)
        print('人在跑步')

    def eat(self, food):
        # self =  p1; food = '包子'
        self.run()
        print('self2', self)
        print(food)


def main():
    # 創(chuàng)建對象
    p1 = Person()
    # 通過對象p1調(diào)用對象方法
    print('p1:', p1)
    p1.run()
    # 調(diào)用對象方法只需要給出了self以外的其他參數(shù)傳參
    p1.eat('包子')

    p2 = Person()
    p2.run()


if __name__ == '__main__':
    main()

init方法和構(gòu)造方法:

1.init方法: init
init方法是類中的一個(gè)特殊的對象方法,專門用來對象創(chuàng)建的對象進(jìn)行初始化白华。
當(dāng)通過類創(chuàng)建對象的時(shí)候慨默,系統(tǒng)就會自動調(diào)用init方法

2.構(gòu)造方法
a.什么是構(gòu)造方法
函數(shù)名和類名一樣的函數(shù)就是構(gòu)造方法, 專門用來創(chuàng)建對象弧腥。
python中聲明類的時(shí)候系統(tǒng)會自動創(chuàng)建這個(gè)類對應(yīng)的構(gòu)造方法厦取。

b.構(gòu)造方法的執(zhí)行過程
當(dāng)我們構(gòu)造方法的時(shí)候內(nèi)部會先在內(nèi)存中開辟空間保存對象;然后用創(chuàng)建的這個(gè)對象去調(diào)用inin方法,用來對對象進(jìn)行初始化;
init方法調(diào)用結(jié)束后,返回對象.

def Person(*args, *kwargs):
對象 = 創(chuàng)建對象
對象.init(
args, **kwargs)
return 對象

注意: 如果類的init方法除了self以外還有其他參數(shù)管搪,那么我們在創(chuàng)建對象的時(shí)候需要通過給構(gòu)造方法來給init方法傳參

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


class Dog:
    def __init__(self, x=0, y=9):
        print(x, y)
        print('dog的init')


# =============構(gòu)造方法和init的關(guān)系(了解)=============
# 構(gòu)造方法的偽代碼
def my_init(x, y, z=0):
    print(x, y, z)
    print('my_init')


def my_Dog(*args, **kwargs):
    my_init(*args, **kwargs)


my_Dog(10, 20, 34)
my_Dog(10, 34)
# ===================================================


def main():
    # 人類
    print('====')
    p1 = Person()
    print('====')

    p2 = Person()

    # 狗類
    dog1 = Dog(10, 20)
    dog2 = Dog()
    dog3 = Dog(100)
    dog4 = Dog(y=200)


if __name__ == '__main__':
    main()

對象屬性:

1.什么是對象屬性
類中的屬性分為類的字段和對象屬性
a.對象屬性 - 屬性的值會因?yàn)閷ο蟛煌灰粯樱@種屬性就應(yīng)該聲明為對象屬性
聲明在init方法中 - 位置
以'self.屬性名 = 值'的方式來聲明(這兒的屬性就是對象屬性) - 方式
通過'對象.屬性'的方式來使用 - 使用

b.類的字段 - 屬性的值不會因?yàn)閷ο蟛煌煌浚@種屬性就聲明成類的字段
直接聲明類的里面奇钞,函數(shù)的外面的變量就是類的字段
以'字段名 = 值'
通過'類.字段'的方式來使用

class Person:
    # num就是類的字段
    num = 61
    # 在init方法中聲明對象屬性
    def __init__(self, name='', age=0):
        self.name = name
        self.age = age

練習(xí):創(chuàng)建Dog類,有屬性名字漂坏、類型景埃、年齡
要求創(chuàng)建Dog的對象的時(shí)候:不能給年齡賦值,可以給類型賦值也可以不用給類型賦值顶别,必須給名字賦值

# 對象方法eat:打印XXX在吃什么
class Dog:
    def __init__(self, name, type='華緣'):
        self.name = name
        self.age = 0
        self.type = type

    def eat(self, food):
        # self = dog1, food = '谷徙??驯绎?'
        # self = dog2, food = '屎'
        print('%s在吃%s' % (self.name, food))

練習(xí): 聲明矩形類蒂胞,擁有屬性長和寬,擁有方法求面積和求周長

class Rect:
    def __init__(self, length: float, width: float):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width

    def perimeter(self):
        return (self.length + self.width) * 2


def main():
    # 使用類的字段
    Person.num = 100
    print(Person.num)

    r1 = Rect(100, 98)
    print(r1.area())
    print(r1.perimeter())

    p1 = Person('小明', 18)
    # 獲取對象屬性的值
    print(p1.name, p1.age)

    p2 = Person('小紅', 20)
    # 修改對象屬性的值
    p2.name = '李四'
    print(p2.name, p2.age)

    dog1 = Dog('大黃')
    dog1.eat('骨頭')

    dog2 = Dog('旺財(cái)', '中華田園犬')
    print(dog2.name, dog2.age, dog2.type)
    dog2.eat('屎')





if __name__ == '__main__':
    main()

對象屬性的增刪查改:

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

# 屬性的增刪改查
class Person:
    def __init__(self, name='', age=0, sex='女'):
        self.name = name
        self.age = age
        self.sex = sex


class Dog:
    # __slots__魔法
    # 約束當(dāng)前類的對象最多能擁有那個(gè)屬性
    __slots__ = ('name', 'color', 'age', 'sex')

    def __init__(self, name='', color='黑色'):
        self.name = name
        self.color = color
        self.age = 10


def main():
    dog1 = Dog('大黃', '黃色')
    # dog1.age = 2
    dog1.name = 'ss'

    del dog1.color
    dog1.sex = '母'
    print(dog1.sex)

    dog2 = Dog()
    # print(dog2.sex)  # AttributeError: sex


    print('==============屬性的增刪改查===============')
    p1 = Person('小花')
    p2 = Person('小紅')

1.查(獲取對象屬性)
對象.屬性 - 獲取指定對象指定屬性值;當(dāng)屬性不存在的時(shí)候會報(bào)錯(cuò)
getattr(對象, 屬性名:str, 默認(rèn)值) - 獲取指定對象指定屬性值;
當(dāng)屬性不存在的時(shí)候如果給默認(rèn)值賦了值条篷,程序不會報(bào)錯(cuò),并且將默認(rèn)值作為結(jié)果

    print('==============查===================')
    print(p1.name)
    # print(p1.name1)   # AttributeError:'Person' object has no attribute 'name1'

    # 屬性不確定的時(shí)候可以使用getattr
    # attr = input('屬性:')
    # print(getattr(p1, attr))

    print(getattr(p1, 'name', None))
    print(getattr(p1, 'name1', None))

增/改
對象.屬性 = 值 - 當(dāng)屬性存在的是修改屬性的值蛤织;屬性不存在的時(shí)候添加屬性setattr(對象, 屬性名, 值) - 當(dāng)屬性存在的是修改屬性的值赴叹;屬性不存在的時(shí)候添加屬性

    print('==============增/改===================')
    # 修改屬性
    p1.name = 'xiaohua'
    print(p1.name)
    # 添加屬性
    p1.height = 180
    print(p1.height)

    # 修改屬性
    setattr(p1, 'age', 18)
    print(p1.age)
    # 添加屬性
    setattr(p1, 'weight', 200)
    print(p1.weight)


del 對象.屬性
delattr(對象, 屬性名)

    print('==============刪=================')
    del p1.sex
    # print(p1.sex)  # AttributeError: 'Person' object has no attribute 'sex'

    delattr(p1, 'age')
    # print(p1.age)  # AttributeError: 'Person' object has no attribute 'age'

    # 注意:對象屬性的操作,只針對操作的那一個(gè)對象指蚜,不會影響其他對象
    print(p1.height)
    # print(p2.height)  # AttributeError: 'Person' object has no attribute 'height'
    print(p2.age)


if __name__ == '__main__':
    main()

內(nèi)置函數(shù):

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

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('%s在吃%s' % (self.name, food))

定制對象的打印格式(當(dāng)我們通過print打印一個(gè)對象的時(shí)候乞巧,實(shí)質(zhì)就是打印對象調(diào)用repr函數(shù)的返回值)
# 這個(gè)函數(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():
    p1 = Person('小明', 18)
    print(p1)    # print(p1.__repr__())

    persons = [Person('p1', 12), Person('p2', 18, '女')]
    print(persons)
  1. 類.name - 獲取的名字(字符串)
    print(Person)
    class_name = Person.__name__
    print(Person, class_name)
    # 值是一個(gè)字符串,可以當(dāng)成字符串來用
    print(class_name.upper())
  1. 對象.class - 獲取對象對應(yīng)的類(結(jié)果是類)
    # 獲取對象p1的類
    my_class = p1.__class__
    print(my_class)
    # 可以將my_class當(dāng)成類來使用
    p2 = my_class('小花')
    print(my_class.num)
  1. 類.doc - 獲取類的說明文檔(字符串)
    print(Person.__doc__)
    print(int.__doc__)

    # 獲取對象p1對應(yīng)的類的說明文檔
    print(p1.__class__.__doc__)

4.對象.dict - 將對象轉(zhuǎn)換成字典摊鸡,將屬性和值作為字典的鍵值對(字典)
# 注意:當(dāng)給slots屬性賦值后绽媒,對象的dict屬性就不能使用

    print(p1.__dict__)

5.類.module - 獲取當(dāng)前類所在的模塊的模塊名

    print(Person.__module__)

6.類.bases - 獲取當(dāng)前類的父類(元祖)

    print(Person.__bases__)


if __name__ == '__main__':
    main()

類方法和靜態(tài)方法:

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

2.類方法:
a.怎么聲明: 聲明函數(shù)前加@classmethod
b.特點(diǎn): 自帶默認(rèn)參數(shù)cls; 調(diào)用的不用傳參,系統(tǒng)會自動將調(diào)用當(dāng)前函數(shù)的類傳給它
(cls是誰調(diào)用就指向誰, 類方法只能通過類來調(diào)用免猾,所以cls就是當(dāng)前類)
類能做的事情是辕,cls都能做

c.怎么調(diào)用: 通過類來調(diào)用, 類.方法()

3.靜態(tài)方法
a.怎么聲明:聲明函數(shù)前加@staticmethod
b.特點(diǎn): 沒有默認(rèn)參數(shù)
c.怎么調(diào)用:通過類來調(diào)用, 類.方法()

4.在類中怎么選擇使用哪種方法:
如果實(shí)現(xiàn)類中的函數(shù)的功能需要使用對象的屬性, 那么這個(gè)函數(shù)就要聲明對象方法猎提。
實(shí)現(xiàn)函數(shù)的功能不需要對象屬性的前提下获三,如果需要類的字段, 就聲明稱類方法
實(shí)現(xiàn)函數(shù)的功能既不需要對象屬性也不需要類的字段就聲明成靜態(tài)方法

class Person:
    num = 61

    def __init__(self):
        self.name = '張三'

    def func4(self):
        print('%s對應(yīng)的對象' % self.name)
        # print('人類的數(shù)量:%d億' % Person.num)

    @staticmethod
    def func3():
        print(Person.num)
        print('我是靜態(tài)方法!')

    @classmethod
    def func2(cls):
        print(cls.num)
        print('我是類方法2')

    @classmethod
    def func1(cls):
        # 類能做的,cls都能做
        p1 = cls()    # 用cls來創(chuàng)建對象
        print(p1)

        cls.num = 100  # 用cls來使用類的字段

        cls.func2()   # 用cls調(diào)用類方法

        print('cls:', cls)
        print('這是一個(gè)類方法')


def main():
    print(Person)
    Person.func1()
    Person.func3()
    p1 = Person()
    p1.func4()


if __name__ == '__main__':
    main()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末锨苏,一起剝皮案震驚了整個(gè)濱河市疙教,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伞租,老刑警劉巖贞谓,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異葵诈,居然都是意外死亡裸弦,警方通過查閱死者的電腦和手機(jī)祟同,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烁兰,“玉大人耐亏,你說我怎么就攤上這事』φ澹” “怎么了广辰?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長主之。 經(jīng)常有香客問我择吊,道長,這世上最難降的妖魔是什么槽奕? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任几睛,我火速辦了婚禮,結(jié)果婚禮上粤攒,老公的妹妹穿的比我還像新娘所森。我一直安慰自己,他們只是感情好夯接,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布焕济。 她就那樣靜靜地躺著,像睡著了一般盔几。 火紅的嫁衣襯著肌膚如雪晴弃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天逊拍,我揣著相機(jī)與錄音上鞠,去河邊找鬼。 笑死芯丧,一個(gè)胖子當(dāng)著我的面吹牛芍阎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缨恒,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼能曾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肿轨?” 一聲冷哼從身側(cè)響起寿冕,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椒袍,沒想到半個(gè)月后驼唱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驹暑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年玫恳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辨赐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡京办,死狀恐怖掀序,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惭婿,我是刑警寧澤不恭,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站财饥,受9級特大地震影響换吧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钥星,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一沾瓦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谦炒,春花似錦贯莺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至透且,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豁鲤,已是汗流浹背秽誊。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琳骡,地道東北人锅论。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像楣号,于是被迫代替她去往敵國和親最易。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345