day13-類和對(duì)象

1.編程思想

  • 1.編程思想

1.面向過(guò)程編程 - 邏輯迅涮、算法
遇到問(wèn)題,直接考慮把邏輯思維轉(zhuǎn)換成代碼,解決問(wèn)題

2.函數(shù)式編程 - 函數(shù)
遇到問(wèn)題畏妖,直接考慮是否有一個(gè)這種功能的函數(shù)

3.面向?qū)ο缶幊?- 類和對(duì)象
遇到問(wèn)題,就考慮是否有一個(gè)對(duì)象能夠幫我解決這個(gè)問(wèn)題

  • 2.類和對(duì)象

1.定義
類:就是擁有相同屬性和相同功能的對(duì)象的集合(類是抽象的)
對(duì)象:類的實(shí)例(對(duì)象是具體的)

2.從生活的角度來(lái)看對(duì)象
如果電腦是一個(gè)類疼阔,每一臺(tái)具體的電腦就是一個(gè)對(duì)象
如果學(xué)生是一個(gè)類戒劫,每一名具體的學(xué)生就是一個(gè)對(duì)象

2.類的聲明

1.類的聲明
語(yǔ)法:
class 類名(父類列表):
類的內(nèi)容

說(shuō)明:
class - 關(guān)鍵字
類名 - 標(biāo)識(shí)符,不能是關(guān)鍵字婆廊,
采用駝峰式命名迅细,并且首字母大寫
見(jiàn)名知意
(父類列表) - 繼承語(yǔ)句;可省略淘邻,省略的時(shí)候相當(dāng)于(object)
類的內(nèi)容 - 主要包含屬性和方法

駝峰式命名:名字有多個(gè)單詞組成通過(guò)單詞首字母大寫來(lái)區(qū)分不同的單詞
studentName,userName...
方法:聲明在類中的函數(shù)就是方法

2.類中的屬性和方法
屬性 - 類中聲明的變量茵典;分為類的字段和對(duì)象屬性
方法 - 類中聲明的函數(shù);分為對(duì)象方法宾舅、類方法和靜態(tài)方法

class Person:
    """人類"""
    # 屬性
    num = 61

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


print(Person)

3.創(chuàng)建對(duì)象
類名() - 創(chuàng)建類對(duì)應(yīng)的對(duì)象

  • 創(chuàng)建Person類的對(duì)象xiao_ming
xiao_ming = Person()
print(xiao_ming)

3.對(duì)象方法

1.什么是對(duì)象方法
直接聲明在類中统阿,并且自帶self的參數(shù)

2.對(duì)象方法的調(diào)用 - 通過(guò)對(duì)象調(diào)用對(duì)象方法
對(duì)象.對(duì)象方法()
(可以通過(guò)類來(lái)調(diào)用對(duì)象方法彩倚,但是需要給self傳參,一般不用)

3.self(當(dāng)前對(duì)象)
對(duì)象方法的第一個(gè)參數(shù)self不用傳參扶平,系統(tǒng)會(huì)自動(dòng)的將當(dāng)前對(duì)象傳給self
哪個(gè)對(duì)象調(diào)用的帆离,self就是誰(shuí)。當(dāng)前對(duì)象能做的self都能做

class Person:
    """人類"""

    # 聲明了一個(gè)對(duì)象方法
    def sleep(self, a):
        # self = p1, a = 10
        print('睡覺(jué)', a, self)
        self.run()

    def run(self):
        print('跑')


p1 = Person()
p1.sleep(10)
print(p1)

4.init方法和構(gòu)造方法

0.魔法方法
python類中结澄,用__ 開(kāi)頭并且 __結(jié)尾的方法哥谷,就是魔法方法。
魔法方法不會(huì)主動(dòng)地調(diào)用麻献,都會(huì)自動(dòng)的調(diào)用

1.__ init __方法
a.是對(duì)象方法
b.不需要自己調(diào)用们妥,會(huì)被自動(dòng)調(diào)用
c.專門用來(lái)對(duì)對(duì)象進(jìn)行初始化的

2.構(gòu)造方法
函數(shù)名和類名一樣的函數(shù)就是構(gòu)造方法
當(dāng)我們創(chuàng)建類的時(shí)候系統(tǒng)會(huì)自動(dòng)創(chuàng)建這個(gè)類的構(gòu)造方法,用來(lái)創(chuàng)建對(duì)象
當(dāng)我們通過(guò)構(gòu)造方法創(chuàng)建對(duì)象的時(shí)候赎瑰,系統(tǒng)會(huì)自動(dòng)調(diào)用init方法來(lái)對(duì)創(chuàng)建好的對(duì)象進(jìn)行初始化

注意:當(dāng)init方法中除了self以外如果需要?jiǎng)e的參數(shù)王悍,那么這些參數(shù)是通過(guò)構(gòu)造方法來(lái)傳參的
只要調(diào)用了構(gòu)造方法,就會(huì)產(chǎn)生新的對(duì)象餐曼。(想要對(duì)象压储,調(diào)用構(gòu)造方法)

class Person:
    def __init__(self, name):
        print('init方法', name)

    def run(self):
        print('跑')
"""
def Person(*args, **kwargs):
    在堆中開(kāi)辟空間創(chuàng)建對(duì)象
    對(duì)象.__init__()
    return 對(duì)象
"""
p1 = Person('小明')
p1.run()
  • 模擬構(gòu)造方法和init方法
def __init__(a, b):
    print('自己實(shí)現(xiàn):', a, b)


def Func1(*args, **kwargs):
    print('創(chuàng)建對(duì)象')
    __init__(*args)
    print('返回對(duì)象')


Func1(10, 20)

5.對(duì)象屬性

1.什么是對(duì)象屬性
a.聲明在__ init __方法中
b.self.屬性名 = 值
c.通過(guò)對(duì)象來(lái)使用: 對(duì)象.屬性

語(yǔ)法:
self.變量名 = 值
說(shuō)明:變量名就是屬性名,這個(gè)變量就是對(duì)象屬性

2.什么樣的屬性應(yīng)該聲明成對(duì)象屬性
如果屬性的值會(huì)因?yàn)閷?duì)象不同而不一樣源譬,那這樣的屬性就應(yīng)該聲明成對(duì)象屬性
反之就聲明成類的字段

  • 情況一:所有的對(duì)象屬性創(chuàng)建的時(shí)候都使用一個(gè)固定的屬性
class Person:
    def __init__(self):
        # 這里的name和age就是Person類的對(duì)象屬性
        self.name = ''
        self.age = 18


# 創(chuàng)建對(duì)象
p1 = Person()
p1.name = '張三'
print(p1.name, p1.age)

p2 = Person()
p2.name = '小紅'
print(p2.name, p1.name)
  • 情況二:創(chuàng)建對(duì)象的時(shí)候集惋,決定對(duì)象屬性的值
class Person:
    def __init__(self, name, age=0):
        # 這里的name和age就是Person類的對(duì)象屬性
        self.name = name
        self.age = age


p3 = Person('李四', 20)
print(p3.name, p3.age)
# 修改對(duì)象屬性的值
p3.age = 18
print(p3.age)
  • 練習(xí):聲明一個(gè)矩形類
class Rect:
    def __init__(self, length, width):
        self.angie1 = '90°'
        self.angie2 = '90°'
        self.angie3 = '90°'
        self.angie4 = '90°'
        self.sidenum = 4
        self.length = length
        self.width = width
    # 一個(gè)對(duì)象方法需不需要除了self以外的其他參數(shù),
    # 看實(shí)現(xiàn)這個(gè)函數(shù)的功能需不需要除了屬性外的其他數(shù)據(jù)
    def area(self):
        area = self.length * self.width
        return '面積是%.2f' % area

    def peri(self):
        peri = (self.length + self.width) * 2
        return '周長(zhǎng)是%.2f' % peri


r1 = Rect(10, 20)
print(r1.area(), r1.peri())
  • 練習(xí):聲明一個(gè)Point類踩娘,擁有屬性x坐標(biāo)和y坐標(biāo)刮刑。求兩個(gè)點(diǎn)之間的距離
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def distance(self, other):
        distance = ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5
        return '兩點(diǎn)之間的距離是%.2f' % distance


d1 = Point(1, 2)
d2 = Point(-5, 6)
print(d1.distance(d2))

6.對(duì)象屬性的增刪改查

class Dog:
    def __init__(self, name, color, type):
        self.name = name
        self.color = color
        self.type = type


dog1 = Dog('旺財(cái)', '黃色', '二哈')
  • 1.查(獲取對(duì)象屬性的值)

a.對(duì)象.屬性名 (如果屬性不存在會(huì)報(bào)錯(cuò))
b.getattr(對(duì)象, 屬性名, 默認(rèn)值) (如果屬性不存在,給個(gè)默認(rèn)值不會(huì)報(bào)錯(cuò),返回默認(rèn)值)

print(dog1.name)
print(getattr(dog1, 'color', '黑色'))
  • 2.增、改
    """
    a.對(duì)象.屬性 = 值 - 當(dāng)屬性存在养渴,修改雷绢;不存在,添加
    b.setattr(對(duì)象, 屬性名, 值)
dog1.name = '小白'
setattr(dog1, 'name', '大黃')
  • 3.刪除

a.del 對(duì)象.屬性
b.delattr(對(duì)象, 屬性名)

del dog1.name
delattr(dog1, 'color')

注意:對(duì)象屬性的增刪改查,都是針對(duì)指定的那一個(gè)對(duì)象

  • 4.__ slots __魔法

__ slots __是用來(lái)約束當(dāng)前這個(gè)類有哪些對(duì)象屬性
如果給類的slots賦了值理卑,那么這個(gè)類的對(duì)象的dict屬性就不能用了

class Student:
    __slots__ = ('name', 'id', 'age')

    def __init__(self, name, age):
        self.name = name
        self.id = '001'
        self.age = age


stu1 = Student('小明', 18)
# stu1.neme = '小紅'

7.類的字段和內(nèi)置類屬性

1.類的字段
a.直接聲明 在類里面翘紊,函數(shù)的外面 的變量 就是類的字段
b.類的字段需要通過(guò)類來(lái)使用:類.字段 - 不管在類的里面還是類的外面都是一樣的

不會(huì)因?yàn)閷?duì)象不同而不一樣的數(shù)據(jù)就聲明成類的字段

class Person:
    # 聲明了一個(gè)字段number
    number = 61

    def show_number(self):
        print('人類的數(shù)量%d' % Person.number)


print(Person.number)

2.內(nèi)置類屬性
內(nèi)置屬性就是聲明類的時(shí)候,類中已經(jīng)聲明好的屬性(包含類的字段和對(duì)象的屬性)

class Dog:
    """說(shuō)明文檔:狗類"""
    # 類的字段
    type = '犬科'

    # 對(duì)象的屬性
    def __init__(self, name='', age=0, color=''):
        self.name = name
        self.age = age
        self.color = color

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

    # 類方法
    @classmethod
    def shout(cls):
        print('汪汪汪...')

    # 靜態(tài)方法
    @staticmethod
    def bite():
        print('狗咬人藐唠!!!')


dog1 = Dog('小黑', 6, '黑色')
  • a.__ name __

類.__ name __ - 獲取類的名字(字符串)

class_name = Dog.__name__
print(Dog.__name__, type(class_name))
  • b.__class __

對(duì)象.__ class __ - 獲取對(duì)象對(duì)應(yīng)的類(結(jié)果是一個(gè)類帆疟,原來(lái)類能做的他都能做)

a = dog1.__class__
print(Dog.__class__)
print(dog1.__class__)
d1 = Dog()
d2 = a()
print(d1, d2)

print(Dog.type)
print(a.type)

print(dog1.__class__.__name__)   
# 獲取對(duì)象對(duì)應(yīng)的類的名字
  • c.__ dict __

(了解)類.__ dict __ - 獲取當(dāng)前類的所有類的字段及其對(duì)應(yīng)的值,以字典的形式返回
(重點(diǎn))對(duì)象.__ dict __ - 將當(dāng)前所有的對(duì)象屬性及其值轉(zhuǎn)換成字典宇立,key是屬性名,value是屬性的值

print(Dog.__dict__)
print(dog1.__dict__)
  • d. __ bases __

類.__base __ - 獲取當(dāng)前類的父類(以元組的形式返回踪宠,元組中的元素就是類的父類)

print(Dog.__bases__)
  • e.__ module __

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

print(Dog.__module__)
  • f.__doc __

類.__ doc __ - 獲取當(dāng)前類的說(shuō)明文檔

print(Dog.__doc__)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市妈嘹,隨后出現(xiàn)的幾起案子柳琢,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件染厅,死亡現(xiàn)場(chǎng)離奇詭異痘绎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肖粮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門孤页,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人涩馆,你說(shuō)我怎么就攤上這事行施。” “怎么了魂那?”我有些...
    開(kāi)封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵蛾号,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我涯雅,道長(zhǎng)鲜结,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任活逆,我火速辦了婚禮精刷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔗候。我一直安慰自己怒允,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布锈遥。 她就那樣靜靜地躺著纫事,像睡著了一般。 火紅的嫁衣襯著肌膚如雪所灸。 梳的紋絲不亂的頭發(fā)上丽惶,一...
    開(kāi)封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音爬立,去河邊找鬼钾唬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛懦尝,可吹牛的內(nèi)容都是我干的知纷。 我是一名探鬼主播壤圃,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼陵霉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了伍绳?” 一聲冷哼從身側(cè)響起踊挠,我...
    開(kāi)封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后效床,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體睹酌,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年剩檀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了憋沿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沪猴,死狀恐怖辐啄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情运嗜,我是刑警寧澤壶辜,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站担租,受9級(jí)特大地震影響砸民,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奋救,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一岭参、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菠镇,春花似錦冗荸、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至隘梨,卻和暖如春程癌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轴猎。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工嵌莉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捻脖。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓锐峭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親可婶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沿癞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • 1 編程思想: 1.1 面向過(guò)程編程 - 工具:邏輯、算法 遇到問(wèn)題考慮直接用代碼矛渴;把邏輯思維轉(zhuǎn)換成代碼椎扬,解決問(wèn)題...
    barriers閱讀 255評(píng)論 0 0
  • 一、面向?qū)ο缶幊?編程思想:1.面向過(guò)程編程 ---> 算法,邏輯(數(shù)學(xué)邏輯) 2.函數(shù)式編程 ---> 函數(shù)蚕涤,...
    龍神海王閱讀 154評(píng)論 0 0
  • 13.1 編程思想 1.編程思想: 1.面向過(guò)程編程 - 邏輯筐赔、算法遇到問(wèn)題考慮直接把邏輯思維轉(zhuǎn)換成代碼,解決問(wèn)題...
    2333_11f6閱讀 198評(píng)論 0 0
  • 【目錄】《咖啡》@遠(yuǎn)航員絕緣兒《站在這場(chǎng)大雨中》《一些雨從海面落下》@遠(yuǎn)航員培源《杯中栗》@遠(yuǎn)航員阿花 cogwr...
    cogwriters遠(yuǎn)航聯(lián)盟閱讀 129評(píng)論 0 0