面向對象編程

一李命,面向對象

1.什么是類(抽象)

對擁有相同屬性和方法的對象的封裝撩鹿,類中相同的屬性的值是不確定的搅方。

2.什么是對象(具體)

對象就是類的實例谬哀,對象的屬性是確定的刺覆。

3.編程的方式
  • 面向過程編程:一步一步寫代碼實現(xiàn)功能--->工具:邏輯和算法
  • 函數(shù)式編程:面對問題考慮有沒有擁有某種功能的函數(shù)--->工具:函數(shù)
  • 面向對象編程:面對問題直接考慮是否有相應的對象來解決這個問題--->工具:類和對象

二,類

1.類的聲明
結構:
class 類名:
  屬性
  方法
  • class :python中聲明類的關鍵字
  • 類名:標識符史煎,類名的首字母大寫谦屑,駝峰式命名
  • ():類如果要繼承自其他類,需要寫括號篇梭,括號里面父類的名字氢橙。
  • 屬性:對象屬性和類的字段----->保存數(shù)據(jù)
  • 方法:實質就是聲明在類中的函數(shù)----->實現(xiàn)類的功能
2.創(chuàng)建對象

a.通過類的構造方法去創(chuàng)建對象(名字和類名同名的方法,自動生成的)

對象名 = 類名()

b.類的對象很洋,可以使用點方法去使用類中的方法和屬性

對象.方法名() 或 對象.屬性名
3.self參數(shù)

對象方法都有一個默認參數(shù)self充蓝,在調用這個方法的時候不需要給這個參數(shù)傳參(系統(tǒng)會自動給這個參數(shù)傳參),誰來調用這個方法喉磁,self就是誰

代碼實現(xiàn):

# 1.聲明Person類
class Person:
    """
    類的說明:人類
    """
    # 生命兩個對象方法谓苟,需要使用對象來調用
    def eat(self):
        print('在吃飯')

    def sleep(self):
        print('在睡覺')

if __name__ == "__main__":
    # 聲明對象
    p1 = Person()
    print(p1)
    # 一個類可以有多個對象
    p2 = Person()
    print(p2)

    # 對象可以調用對象方法
    p1.eat()
    p2.eat()

    p1.sleep()
    p2.sleep()

輸出結果:

<__main__.Person object at 0x00000221D2AA00F0>
<__main__.Person object at 0x00000221D2AA0160>
在吃飯
在吃飯
在睡覺
在睡覺

三,對象的屬性

1.對象屬性的聲明
class 類名:
    def __init__(self):
        self.屬性 = 初值
        self.屬性2 = 初值
2.init方法
  • init方法是系統(tǒng)自帶的方法协怒,這個方法不能直接調用涝焙,而是通過類創(chuàng)建對象的時候,系統(tǒng)會自動調用這個方法
  • init方法的作用是對對象的屬性進行初始化
  • 通過構造方法創(chuàng)建對象的時候孕暇,一定要保證init方法中除了self以外仑撞,其他每個參數(shù)都必須有值
    代碼實現(xiàn):
class Person:
    def __init__(self, name1='', age1=0, sex='女'):
        # 在這個地方聲明對象的屬性
        print('=====')
        print(name1)
        print(sex)
        # 在init方法中聲明對象的屬性
        self.name = name1
        self.age = age1
        self.sex = sex

if __name__ == "__main__":
    # 構造方法中的參數(shù)實際上是傳遞給init方法中的參數(shù)
    p1 = Person('chen', 18)
    # 通過對象使用對象屬性
    print(p1.name)
    print(p1.age)
    print(p1.sex)

    # 創(chuàng)建對象的時候不給屬性賦值
    p3 = Person()
    p3 = Person('CHEN', sex='男')
    p3 = Person(sex='男')

輸出結果:

=====
chen
女
chen
18
女
=====

女
=====
CHEN
男
=====

男

四,對象屬性的增刪查改

1.查妖滔,獲取對象的屬性

方法一:對象.屬性(當獲取的屬性不存在時會報錯)
方法二:對象.getattribute(屬性名)和 getattr(對象, 屬性名, 默認值)

2.改隧哮,修改屬性的值

方法一:對象.屬性 = 新值
方法二:對象.setattr(屬性, 新值) 和 setattr(對象, 屬性名, 新值)

3.增,增加對象屬性

對象.屬性(這個屬性之前不存在)

注意:這個屬性是添加給對象的座舍,而不是類>谙琛!曲秉!
4.刪采蚀,刪除對象屬性

del 對象.屬性

注意:刪除的是對象的屬性疲牵,不會影響這個類的其他對象

代碼實現(xiàn):

"""---chen---"""


class Dog:
    """狗類"""
    def __init__(self, age1=0, color1='red'):
        self.age = age1
        self.color = color1



if __name__ == "__main__":
    dog1 = Dog(age1=2, color1='white')
    # 1.查,獲取屬性
    """
    方法一:對象.屬性(查找的時候如果屬性不存在榆鼠,會報錯)
    方法二:對象.__getattribute__(屬性名)和 getattr(對象, 屬性名, 默認值)
    """
    print(dog1.age, dog1.color)
    print(dog1.__getattribute__('age'))
    print(getattr(dog1, 'age'))
    # 如果設置了default的值纲爸,那么當屬性不存在的時候不會報錯,并且返回默認值
    print(getattr(dog1, 'abc', None))

    # 2.改妆够,修改屬性的值
    """
    方法一:對象.屬性 = 新值
    方法二:對象.__setattr__(屬性, 新值) 和 setattr(對象, 屬性名, 新值)
    """
    dog1.age = 3
    print(dog1.age)

    dog1.__setattr__('color', 'black')
    print(dog1.color)

    setattr(dog1, 'color', 'blue')
    print(dog1.color)


    # 3.增识啦,增加對象屬性
    """
    對象.屬性(這個屬性之前不存在)
    注意:這個屬性是添加給對象的,而不是類T鹁病T摹!
    """
    dog1.name = '大黃'
    print(dog1.name)
    dog1.__setattr__('type', '哈士奇')
    print(dog1.type)

    setattr(dog1, 'sex', '公狗')
    print(dog1.sex)

    # dog2 = Dog()
    # print(dog2.name)

    # 4.刪灾螃,刪除對象屬性
    """
    del 對象.屬性
    注意:刪除的是對象的屬性,不會影響這個類的其他對象
    """
    # del dog1.age
    # print(dog1.age) AttributeError: 'Dog' object has no attribute 'name'
    # dog1.__delattr__('age')
    delattr(dog1, 'age')
    # print(dog1.age)

輸出結果:

2 white
2
2
None
3
black
blue
大黃
哈士奇
公狗
六揩徊,slotsstr

_slots的作用:約束類中的對象屬性
_str
的作用:自定義對象的打印格式
代碼實現(xiàn):

class Person:
    # __slots__的功能:約束類中的對象屬性
    __slots__ = ('name', 'age', 'sex')

    def __init__(self, name='', age=0):
        self.name = name
        self.age = age
        # self.tel = 123 AttributeError: 'Person' object has no attribute 'tel'

    # 自定義對象的打印格式
    def __str__(self):
        return '人類'

輸出結果:

人類

七腰鬼,類中的方法

1.屬性的分類
  • 對象的屬性
    對象屬性是屬于對象的,不同的對象對應的值可能不一樣塑荒。對象屬性熄赡,通過對象來使用
  • 類的屬性(字段)
    類的屬性聲明在類里面,函數(shù)外面齿税。類屬性屬于類彼硫,通過類來使用
2.方法的分類
  • 對象方法
    對象方法自帶一個self參數(shù),一般通過對象去調用
  • 類方法
    類方法使用@classmethod修飾 凌箕。自帶一個cls參數(shù)拧篮,這個參數(shù)不用傳參,誰來調用這個方法牵舱,cls就指向誰串绩。類方法要通過類來調用
  • 靜態(tài)函數(shù)
    靜態(tài)函數(shù)使用@staticmethod修飾 ,沒有默認參數(shù) 芜壁,靜態(tài)方法要通過類來調用
3.方法的選擇
  • 如果實現(xiàn)函數(shù)的功能需要使用對象的屬性礁凡,就是用對象方法;
  • 如果實現(xiàn)函數(shù)的功能需要使用字段或者調用類的方法慧妄,就是聲明成對象方法顷牌;
  • 如果實現(xiàn)函數(shù)功能既不需要對象屬性,也不需要類的字段塞淹,就聲明成靜態(tài)方法窟蓝。
    代碼實現(xiàn):
class Person:
    # number是類屬性
    number = 0

    def __init__(self, name='', age=0):
        # name 和 age 都是對象屬性
        self.name = name
        self.age = age

    # eat方法是對象方法
    def eat(self, food):
        print('%s在吃%s' % (self.name, food))

    # hurt_earth就是一個類方法
    @classmethod
    def hurt_earth(cls):
        # cls指向的是Person,cls可以當成類來使用
        pt = cls('張三')  # 可以使用cls創(chuàng)建類的對象
        print(pt.name)
        print(cls.number)   # 也可以使用cls使用類的字段
        print('人類破壞環(huán)境!窖铡!')

    # protect_earth是一個靜態(tài)方法
    @staticmethod
    def protect_earth():
        print('人類保護地球A迫瘛坊谁!')


if __name__ == "__main__":
    # 類字段要通過類來使用
    print(Person.number)
    # 對象的屬性通過對象來使用
    p1 = Person('小明')
    print(p1.name, p1.age)
    # 對象方法對象調用
    p1.eat('面條')
    p2 = Person('小紅')
    p2.eat('火鍋')
    # 類方法通過類來調用
    Person.hurt_earth()
    # 靜態(tài)方法通過類來調用
    Person.protect_earth(

輸出結果:

0
小明 0
小明在吃面條
小紅在吃火鍋
張三
0
人類破壞環(huán)境!滑臊!
人類保護地球?谏帧!
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末雇卷,一起剝皮案震驚了整個濱河市鬓椭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌关划,老刑警劉巖小染,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贮折,居然都是意外死亡裤翩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門调榄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踊赠,“玉大人,你說我怎么就攤上這事每庆】鸫” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵缤灵,是天一觀的道長伦籍。 經(jīng)常有香客問我,道長腮出,這世上最難降的妖魔是什么帖鸦? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮利诺,結果婚禮上富蓄,老公的妹妹穿的比我還像新娘。我一直安慰自己慢逾,他們只是感情好立倍,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侣滩,像睡著了一般口注。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上君珠,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天寝志,我揣著相機與錄音,去河邊找鬼。 笑死材部,一個胖子當著我的面吹牛毫缆,可吹牛的內容都是我干的。 我是一名探鬼主播乐导,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼苦丁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了物臂?” 一聲冷哼從身側響起旺拉,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棵磷,沒想到半個月后蛾狗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡仪媒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年沉桌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片规丽。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒲牧,死狀恐怖,靈堂內的尸體忽然破棺而出赌莺,到底是詐尸還是另有隱情,我是刑警寧澤松嘶,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布艘狭,位于F島的核電站,受9級特大地震影響翠订,放射性物質發(fā)生泄漏巢音。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一尽超、第九天 我趴在偏房一處隱蔽的房頂上張望官撼。 院中可真熱鬧,春花似錦似谁、人聲如沸傲绣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秃诵。三九已至,卻和暖如春塞琼,著一層夾襖步出監(jiān)牢的瞬間菠净,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毅往,地道東北人牵咙。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像攀唯,于是被迫代替她去往敵國和親洁桌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內容