Day 15classObject

一、編程思想

1.面向過程編程 - 遇到問題直接將邏輯轉換成代碼; 邏輯思維,算法
2.函數式編程 - 遇到問題就想找一個呕童、寫一個擁有相應功能的函數; 以函數作用工具
3.面向對象編程 - 遇到問題就考慮可以不可以有一個類來給我提供相應的功能和數據; 以類和對象為工具

python既支持函數式編程也支持面向對象編程

二砚婆、認識類和對象

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

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

人是類志于, 李源就是人類的對象
車是類涮因, 樓下停在...的那輛車就是對象
電腦是類, 我桌上這臺黑色的電腦就是對象

2.類的聲明

類中的內容包含功能(函數)和屬性(變量/屬性)
a.語法
class 類名:
類的內容

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

3.對象的聲明

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

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

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


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

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

    p3 = p2
    print(p3)


if __name__ == '__main__':
    main()

三养泡、對象方法

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

1.類中的方法

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

2.對象方法:

a.什么是對象方法
直接聲明在類中的方法就是對象方法
有默認參數self
通過 ' 對象.方法() '的方式來調用(對象方法要通過對象來調用)

b.參數self
當我們通過對象調用對象方法的時候嗜湃,self不需要傳參;因為系統(tǒng)會自動將當前對象傳遞給self。
當前對象:調用當前方法的對象(誰調用對象方法self就是誰)
注意:當前類的對象能做的事情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)
    # 創(chuàng)建對象
    p1 = Person()
    # 通過對象p1調用對象方法
    print('p1:', p1)
    p1.run()
    # 調用對象方法只需要給出了self以外的其他參數傳參
    p1.eat('包子')

    p2 = Person()
    p2.run()

四澜掩、init方法和構造方法

1.init方法: init

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

2.構造方法

a.什么是構造方法
函數名和類名一樣的函數就是構造方法肩榕, 專門用來創(chuàng)建對象刚陡。
python中聲明類的時候系統(tǒng)會自動創(chuàng)建這個類對應的構造方法。

b.構造方法的執(zhí)行過程
當我們構造方法的時候內部會先在內存中開辟空間保存對象;然后用創(chuàng)建的這個對象去調用 _ _ inin _ _方法,用來對對象進行初始化;
_ _ init _ _方法調用結束后株汉,返回對象.

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

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

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


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

構造方法和init的關系(了解)

# 構造方法的偽代碼
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)
    # 人類
    print('====')
    p1 = Person()
    print('====')

    p2 = Person()

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

五蝙云、對象屬性

1.什么是對象屬性

類中的屬性分為類的字段和對象屬性
a.對象屬性 - 屬性的值會因為對象不同而不一樣,這種屬性就應該聲明為對象屬性
聲明在init方法中 - 位置
以 ' self.屬性名 = 值 ' 的方式來聲明(這兒的屬性就是對象屬性) - 方式
通過'對象.屬性'的方式來使用 - 使用

b.類的字段 - 屬性的值不會因為對象不同而不同路召,這種屬性就聲明成類的字段
直接聲明類的里面勃刨,函數的外面的變量就是類的字段
以'字段名 = 值'
通過'類.字段'的方式來使用

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

    # 在init方法中聲明對象屬性
    def __init__(self, name='', age=0):
        self.name = name
        self.age = age

練習:創(chuàng)建Dog類,有屬性名字股淡、類型朵你、年齡
要求創(chuàng)建Dog的對象的時候:不能給年齡賦值,可以給類型賦值也可以不用給類型賦值揣非,必須給名字賦值
對象方法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))

練習: 聲明矩形類抡医,擁有屬性長和寬,擁有方法求面積和求周長

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('旺財', '中華田園犬')
    print(dog2.name, dog2.age, dog2.type)
    dog2.eat('屎')

六早敬、對象屬性的增刪改查

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

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


class Dog:
    # __slots__魔法
    # 約束當前類的對象最多能擁有那個屬性
    __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.查(獲取對象屬性)
    """
    對象.屬性  - 獲取指定對象指定屬性值;當屬性不存在的時候會報錯
    getattr(對象, 屬性名:str, 默認值)  - 獲取指定對象指定屬性值;
                                      當屬性不存在的時候如果給默認值賦了值忌傻,程序不會報錯,并且將默認值作為結果
    """
    print('==============查===================')
    print(p1.name)
    # print(p1.name1)   # AttributeError:'Person' object has no attribute 'name1'

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

    print(getattr(p1, 'name', None))
    print(getattr(p1, 'name1', None))
    # 增/改
    """
    對象.屬性 = 值   - 當屬性存在的是修改屬性的值搞监;屬性不存在的時候添加屬性
    setattr(對象, 屬性名, 值) - 當屬性存在的是修改屬性的值水孩;屬性不存在的時候添加屬性
    """
    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'

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

七俘种、內置屬性

"""
內置屬性指的是我們創(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('%s在吃%s' % (self.name, food))
"""
定制對象的打印格式(當我們通過print打印一個對象的時候,實質就是打印對象調用__repr__函數的返回值)

"""
    # 這個函數的返回值必須是字符串
    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)
    # 值是一個字符串绝淡,可以當成字符串來用
    print(class_name.upper())

    # 2. 對象.__class__  - 獲取對象對應的類(結果是類)
    # 獲取對象p1的類
    my_class = p1.__class__
    print(my_class)
    # 可以將my_class當成類來使用
    p2 = my_class('小花')
    print(my_class.num)

    # 3. 類.__doc__  - 獲取類的說明文檔(字符串)
    print(Person.__doc__)
    print(int.__doc__)

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

    # 4.對象.__dict__  - 將對象轉換成字典宙刘,將屬性和值作為字典的鍵值對(字典)
    # 注意:當給__slots__屬性賦值后,對象的__dict__屬性就不能使用
    print(p1.__dict__)

    # 5.類.__module__ - 獲取當前類所在的模塊的模塊名
    print(Person.__module__)

    # 6.類.__bases__ - 獲取當前類的父類(元祖)
    print(Person.__bases__)

八牢酵、類方法和靜態(tài)方法

1.對象方法:

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

2.類方法:

a.怎么聲明: 聲明函數前加@classmethod
b.特點: 自帶默認參數cls; 調用的不用傳參悬包,系統(tǒng)會自動將調用當前函數的類傳給它
(cls是誰調用就指向誰, 類方法只能通過類來調用,所以cls就是當前類)
類能做的事情馍乙,cls都能做

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

3.靜態(tài)方法

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

4.在類中怎么選擇使用哪種方法:

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

class Person:
    num = 61

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

    def func4(self):
        print('%s對應的對象' % self.name)
        # print('人類的數量:%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調用類方法

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


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


if __name__ == '__main__':
    main()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末棵譬,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子预伺,更是在濱河造成了極大的恐慌茫船,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扭屁,死亡現場離奇詭異算谈,居然都是意外死亡,警方通過查閱死者的電腦和手機料滥,發(fā)現死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門然眼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葵腹,你說我怎么就攤上這事高每。” “怎么了践宴?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵鲸匿,是天一觀的道長。 經常有香客問我阻肩,道長带欢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任烤惊,我火速辦了婚禮乔煞,結果婚禮上,老公的妹妹穿的比我還像新娘柒室。我一直安慰自己渡贾,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布雄右。 她就那樣靜靜地躺著空骚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪擂仍。 梳的紋絲不亂的頭發(fā)上囤屹,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音防楷,去河邊找鬼牺丙。 笑死,一個胖子當著我的面吹牛复局,可吹牛的內容都是我干的冲簿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亿昏,長吁一口氣:“原來是場噩夢啊……” “哼峦剔!你這毒婦竟也來了?” 一聲冷哼從身側響起角钩,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吝沫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后递礼,有當地人在樹林里發(fā)現了一具尸體惨险,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年脊髓,在試婚紗的時候發(fā)現自己被綠了辫愉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡将硝,死狀恐怖恭朗,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情依疼,我是刑警寧澤痰腮,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站律罢,受9級特大地震影響膀值,放射性物質發(fā)生泄漏。R本人自食惡果不足惜误辑,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一虫腋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稀余,春花似錦悦冀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至师骗,卻和暖如春历等,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辟癌。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工寒屯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓寡夹,卻偏偏與公主長得像处面,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菩掏,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355