Day_15-類和對象(基礎(chǔ))

一、編程思想

1.面向過程
做法:遇到問題直接將(邏輯和算法)轉(zhuǎn)換為代碼
使用工具:邏輯和算法
2.面向函數(shù)式編程
做法:遇到問題就想找一個养篓、寫一個相應(yīng)功能的函數(shù)
使用工具:函數(shù)
3.面向?qū)ο?/strong>
做法:遇到問題就考慮可不可以有一個類來提供相應(yīng)的功能和數(shù)據(jù)
使用工具:類和對象
類中的屬性 - 對數(shù)據(jù)的封裝
類中的函數(shù) - 對功能的封裝

二、類和對象基礎(chǔ)

1.類和對象的概念
a.什么是類
概念:擁有相同功能和相同屬性的對象的集合(抽象)
b.什么是對象
概念:類的實例(具體)

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

b.說明
class: 聲明類的關(guān)鍵字
類名:標(biāo)識符洗显,并且不能是關(guān)鍵字
規(guī)范:采用大駝峰式命名
:規(guī)定寫法
類的內(nèi)容:累的方法拧烦、屬性和說明文檔
方法:聲明在類中的函數(shù)
屬性:聲明在類中的變量

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

注意:同一個類可以創(chuàng)建多個對象
示例:

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

    # 類中的方法
    def eat(self):
        print('人在吃飯V位健!')
    # 創(chuàng)建Person類的對象茉帅;p1就是對象
    p1 = Person()
    print(p1)

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

三叨叙、對象方法

聲明類的偽代碼
class 類名:
? 類中的屬性
? 類中的方法

1.什么是類中的方法
聲明在類中的函數(shù)就是方法
分類
指導(dǎo)思想:怎么聲明,怎么調(diào)用堪澎,特點
a.對象方法
聲明:直接聲明在類中
特點:有默認(rèn)參數(shù)self,通過對象調(diào)用可以不用傳參
調(diào)用:對象.對象方法名
當(dāng)前對象:調(diào)用當(dāng)前方法的對象(誰調(diào)用對象方法self就是誰)
注意:當(dāng)前類的對象能做的事情擂错,self都能做

b.類方法
聲明:聲明函數(shù)前加@classmethod
特點:有默認(rèn)參數(shù)cls,通過類調(diào)用時,可以不用傳參
調(diào)用:類名.類方法名
當(dāng)前對象:調(diào)用當(dāng)前方法的類(誰調(diào)用類方法*cls就是誰)
注意:當(dāng)前類能做的事情樱蛤,cls都能做
c.靜態(tài)方法
聲明:聲明函數(shù)前加@staticmethod
特點:沒有默認(rèn)參數(shù)
調(diào)用:類名.靜態(tài)方法名

實際運用

類中怎么選擇使用哪種方法:
對象方法:實現(xiàn)函數(shù)功能需要使用對象屬性
類方法
1.不需要使用對象屬性為前提
2.需要使用類的字段
靜態(tài)方法:對象屬性和類的字段皆不需要

class Person:
    # 類的字段
    num = 23

    # 對象方法:用到對象屬性name
    def __init__(self):
        self.name = '張三'

    # 對象屬性和類的字段都有钮呀,選擇對象方法
    def func4(self):
        # 通過self.name來獲取對象的姓名
        print('%s對應(yīng)的對象' % self.name)
        # 通過 類名.類的字段 來使用類的字段
        print('人類的數(shù)量%d億' % Person.num)

    # 靜態(tài)方法:對象屬性和類的字段都不需要
    @staticmethod
    def func3():

        print('我是靜態(tài)方法')
    # 類方法:需要使用類的字段
    @classmethod
    def func1(cls):
        # 類能做的事情,cls都能做
        p1 = cls()  # 用cls創(chuàng)建對象
        print(p1)
        cls.num = 100  # 用cls來使用類的字段
        print(cls)
        print('這是一個類方法')

四昨凡、init方法和構(gòu)造方法

1.init方法init
定義:類中的一個特殊的對象方法
功能:專門用來對象創(chuàng)建的對象進行初始化
過程:當(dāng)通過類創(chuàng)建對象時爽醋,系統(tǒng)就會自動調(diào)用init方法

2.構(gòu)造方法
定義:函數(shù)名和類名一樣的函數(shù)
功能:專門用來創(chuàng)建對象
原理
1.聲明類時,系統(tǒng)自動創(chuàng)建類對應(yīng)的構(gòu)造方法
內(nèi)部如何實現(xiàn)
2.創(chuàng)建對象時便脊,內(nèi)部會先在內(nèi)部開辟空間保存對象蚂四;然后用創(chuàng)建的對象去調(diào)用init方法,用來對對象進行初始化哪痰,init方法結(jié)束后遂赠,返回對象

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

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

魔法方法:類中以__開頭并且以__結(jié)尾的方法
特點:創(chuàng)建對象時肋演,無需主動調(diào)用抑诸,系統(tǒng)會自動調(diào)用

# =========構(gòu)造方法和init方法的原理=========
# 構(gòu)造方法的偽代碼
def my_init(x, y, z):
    print(x, y, z)
    print('my_init')

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

my_Dog(10, 29, 39)

五、類中屬性

分類:類的字段和對象屬性
a.對象屬性
特點:屬性的值會因為對象不同而不同
聲明:init對象方法中
方式:self.屬性 = 值(這里屬性就是對象屬性)
調(diào)用:對象.屬性

b.類的字段
特點:屬性的值不會因為對象的不同而不同
聲明:在類中惋啃,但在函數(shù)外
方式:類的字段名 = 值
調(diào)用:類名.類的字段名

class Person:
    # 類的字段
    num = 33

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

對象屬性的增刪改查

1.查(獲取對象屬性)
方法一
對象.屬性
功能:獲取指定對象的指定屬性值;屬性不存在報錯
錯誤類型:AttributeError 屬性錯誤

class Person:
    def __init__(self, name='', age=0, sex='女'):
        self.name = name
        self.age = age
        self.sex = sex
print(p1.name)
# print(p1.name1)  # AttributeError 屬性錯誤

方法二
getattr(對象哼鬓,屬性名)
功能:獲取指定對象的指定屬性值;
特點:屬性不存在,給默認(rèn)值賦值边灭,不會報錯异希,并且將默認(rèn)值作為結(jié)果返回
應(yīng)用場景:不確定屬性值是否存在時使用

class Person:
    def __init__(self, name='', age=0, sex='女'):
        self.name = name
        self.age = age
        self.sex = sex
# 屬性不確定,可以使用getattr
    # attr = input('屬性:')
    # print(getattr(p1, attr))
print(getattr(p1, 'name', None))
print(getattr(p1, 'name1', None))

2.增(添加屬性)/ 改(修改屬性的值)
方法一
對象.屬性 = 值
功能
1.屬性存在,修改屬性值
2.屬性不存在称簿,添加屬性
方法二
setattr(對象扣癣,屬性名,值)
功能
1.屬性存在憨降,修改屬性值
2.屬性不存在父虑,添加屬性

class Person:
    def __init__(self, name='', age=0, sex='女'):
        self.name = name
        self.age = age
        self.sex = sex
# 修改屬性
p1.name = '啊帥'
print(p1.name)
# 添加屬性
p1.height = 180
print(p1.height)

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

3.刪(刪除屬性)
方法一
del 對象.屬性
功能:刪除對象屬性
方法二
delattr(對象,屬性名)
輸入:2個授药,對象士嚎、屬性名
功能:刪除對象屬性

class Person:
    def __init__(self, name='', age=0, sex='女'):
        self.name = name
        self.age = age
        self.sex = sex
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'

注意:對象屬性的操作只針對于當(dāng)前對象,不會影響其他對象

補充:__slots__魔法方法

功能:約束當(dāng)前對象能夠擁有的屬性個數(shù)
特點:init方法里對象屬性的個數(shù)少于或者等于slots方法的個數(shù)

class Dog:
    # __slots__魔法
    # 約束當(dāng)前對象最多能擁有的那個屬性
    __slots__ = ('name', 'color', 'sex', 'age')  # 下邊聲明的屬性比這里少就行

    def __init__(self, name= '', color='黑色'):
        self.name = name
        self.color = color
dog1 = Dog('大話', '黃色')
    dog1.name = 'sss'
    del dog1.color

六悔叽、內(nèi)置屬性

定義:創(chuàng)建對象時莱衩,系統(tǒng)自動給我們添加的屬性(通過繼承得到)

  • __name__
    功能:獲取類的名字
    返回值:字符串
    調(diào)用:類名.__name__
    補充:獲取的字符串可以當(dāng)做字符串來用
class Person:
    """說明文檔:人類"""
    num = 62
    def __init__(self, name='', age=0, sex='男'):
        self.name = name
        self.age = age
        self.sex = sex
print(Person)  # <class '__main__.Person'>
print(Person.__name__, type(Person.__name__))  # Person <class 'str'>
 # 值是一個字符串,可以當(dāng)做字符串來用
print(Person.__name__.upper())  # PERSON
  • __class__
    功能:獲取對象對應(yīng)的類
    返回值:類名
    調(diào)用:對象.__class__
    補充:可以將獲取的類名當(dāng)做類來用
class Person:
    """說明文檔:人類"""
    num = 62
    def __init__(self, name='', age=0, sex='男'):
        self.name = name
        self.age = age
        self.sex = sex
p1 = Person()
my_class = p1.__class__
print(my_class)  # <class '__main__.Person'>
# 可以將my_class當(dāng)做類使用
p2 = my_class('笑素數(shù)')
print(p2.num)  # 62
  • __doc__
    功能:獲取類的說明文檔
    返回值:字符串
    調(diào)用:類名.__doc__
class Person:
    """說明文檔:人類"""
    num = 62
    def __init__(self, name='', age=0, sex='男'):
        self.name = name
        self.age = age
        self.sex = sex
print(Person.__doc__)  # 說明文檔:人類
# 獲取p1對應(yīng)的說明文檔
p1 = Person()    
print(p1.__class__.__doc__)  # 說明文檔:人類
  • __dict__
    功能:將對象屬性轉(zhuǎn)化為字典娇澎,屬性作為key笨蚁,值作為value
    返回值:字典
    調(diào)用:對象.__dict__
坑:當(dāng)給slots屬性賦值后,對象的dict屬性就不能使用
class Person:
    """說明文檔:人類"""
    num = 62
    def __init__(self, name='', age=0, sex='男'):
        self.name = name
        self.age = age
        self.sex = sex
p1 = Person()  
print(p1.__dict__)  # {'name': '', 'age': 0, 'sex': '男'}
  • __bases__
    功能:獲取當(dāng)前類的父類
    返回值:元祖
    調(diào)用:類名.__bases__
class Person:
    """說明文檔:人類"""
    num = 62
    def __init__(self, name='', age=0, sex='男'):
        self.name = name
        self.age = age
        self.sex = sex
print(Person.__bases__)  # (<class 'object'>,)

補充:__repr__

原理:當(dāng)通過print打印一個對象的時候趟庄,實質(zhì)是打印對象調(diào)用__repr__函數(shù)的返回值
功能:定制對象的打印格式
返回值:字符串
聲明:類中的對象魔法方法

class Person:
    """說明文檔:人類"""
    num = 62
    def __init__(self, name='', age=0, sex='男'):
        self.name = name
        self.age = age
        self.sex = sex

    def __repr__(self):
    # 系統(tǒng)默認(rèn)的打印格式
    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))  # 定制
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末括细,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子戚啥,更是在濱河造成了極大的恐慌奋单,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猫十,死亡現(xiàn)場離奇詭異辱匿,居然都是意外死亡,警方通過查閱死者的電腦和手機炫彩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門匾七,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人江兢,你說我怎么就攤上這事昨忆。” “怎么了杉允?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵邑贴,是天一觀的道長。 經(jīng)常有香客問我叔磷,道長拢驾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任改基,我火速辦了婚禮繁疤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己稠腊,他們只是感情好躁染,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著架忌,像睡著了一般吞彤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叹放,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天饰恕,我揣著相機與錄音,去河邊找鬼井仰。 笑死懂盐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的糕档。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼拌喉,長吁一口氣:“原來是場噩夢啊……” “哼速那!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尿背,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤端仰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后田藐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荔烧,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年汽久,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹤竭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡景醇,死狀恐怖臀稚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情三痰,我是刑警寧澤吧寺,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站散劫,受9級特大地震影響稚机,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜获搏,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一赖条、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦谋币、人聲如沸仗扬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽早芭。三九已至,卻和暖如春诅蝶,著一層夾襖步出監(jiān)牢的瞬間退个,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工调炬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留语盈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓缰泡,卻偏偏與公主長得像刀荒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棘钞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 2016-06-13 08:12 來自QQ空間日志 遠(yuǎn)途跋涉的疲憊缠借, 在驛站里相守。 龍舟水響的五月宜猜, 你曾經(jīng)來過...
    梁汝閱讀 266評論 0 2
  • 一泼返、虛擬機概況三臺centos7.5 4g(內(nèi)存) 2核 40g 二、環(huán)境變量以及安裝準(zhǔn)備1姨拥、/etc/prof...
    James0824閱讀 165評論 0 1
  • 時間管理之03運動篇 早安绅喉,今天是金偉家長課堂 100天好習(xí)慣養(yǎng)成 早起打卡計劃的第51天! 你想健康嗎叫乌?來吧柴罐,一...
    金偉的心靈花園閱讀 120評論 0 0
  • 今天早上把桑塔拉的囚籠套裝好了下次在有類似的不要說那好工具都不做有時換種方式這樣可以更快的解決問題而不是只想著一種方法。
    偶然_9101閱讀 95評論 0 0
  • Part 1 Q&A 1. Why saying no is important? Have you had a ...
    carmenmj閱讀 647評論 0 0