day13-類和對(duì)象

13.1 編程思想

  • 1.編程思想:

1.面向過程編程 - 邏輯貌亭、算法
遇到問題考慮直接把邏輯思維轉(zhuǎn)換成代碼,解決問題
2.函數(shù)式編程 - 函數(shù)
遇到問題想到用函數(shù)解決认臊∑酝ィ考慮是否有這種功能的函數(shù)。
3.面向?qū)ο缶幊?- 類和對(duì)象
遇到問題失晴,就考慮是否有一個(gè)對(duì)象能幫我解決這個(gè)問題

  • 2.類和對(duì)象

1.定義
類:就是擁有相同屬性和功能的對(duì)象的集合(類是抽象的)
對(duì)象:類的實(shí)例(對(duì)象是具體的)
2.從生活的角度考慮類的對(duì)象
如果‘人’是一個(gè)類剧腻,余婷是一個(gè)對(duì)象,駱老師也是一個(gè)對(duì)象涂屁。

13.2 類的聲明

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

說明:
class - 聲明類的關(guān)鍵字
類名 - 標(biāo)識(shí)符书在,不能是關(guān)鍵字;采用駝峰式命名拆又,并且首字母大寫儒旬;見名知義。
(父類列表) - 繼承語法帖族;可以省略栈源,省略時(shí)相當(dāng)于(objct)即基類(祖宗類)。
類的內(nèi)容 - 主要包含屬性和方法

補(bǔ):駝峰式命名:名字由多個(gè)單詞組成竖般,通過單詞首字母大寫來區(qū)分不同的單詞甚垦。
方法:python中聲明在類中的函數(shù)叫方法。

  • 2.類的屬性和方法

類中的屬性 - 指的是在類中聲明的變量涣雕;分為類的字段和對(duì)象屬性
類中的方法 - 指的是在類中聲明的函數(shù)艰亮;分為對(duì)象方法,類方法和靜態(tài)方法挣郭。

# 聲明了一個(gè)Person類
class Person:
    """人類"""
    num = 61      # 類的字段
    age = 61      # 對(duì)象屬性
    name = 123

    # 方法
    def eat(self):
        print('%s在吃飯垃杖。' % Person.name)


# Person是類(類就是類型)
print(Person)              # <class '__main__.Person'>
  • 3.創(chuàng)建對(duì)象
類名()- 創(chuàng)建類對(duì)應(yīng)的對(duì)象
xiao_ming = Person()
# 創(chuàng)建Person類的對(duì)象xiao_ming
print(xiao_ming)           # <__main__.Person object at 0x000001D82796B8D0>
xiao_ming.eat()            # 123在吃飯。
print(xiao_ming.name)      # 123

12.3 對(duì)象方法

  • 1.什么是對(duì)象方法
    直接聲明在類中丈屹,并且自帶一個(gè)叫self的參數(shù)的函數(shù)调俘,就是對(duì)象方法伶棒。
  • 2.對(duì)象方法的調(diào)用 - 通過對(duì)象調(diào)用對(duì)象方法
    對(duì)象.對(duì)象方法()
  • 3.self(當(dāng)前對(duì)象)
    通過對(duì)象調(diào)用對(duì)象方法時(shí),對(duì)象方法中第一個(gè)參數(shù)self不用傳參彩库,系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self肤无。哪個(gè)對(duì)象調(diào)用的self就指向誰。

注意:
當(dāng)前類的對(duì)象能做的事情骇钦,self都能做宛渐。

# 創(chuàng)建一個(gè)Person類
class Person:
    """人類"""
    def __init__(self):
        self.name = ''
    # 聲明了一個(gè)對(duì)象方法sleep
    def sleep(self):
        print('self', self)
        print('%s睡覺!' % self.name)
        self.run()                # 對(duì)象能做的眯搭,self都能做窥翩;當(dāng)前對(duì)象

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


# 創(chuàng)建person對(duì)象p1
p1 = Person()
print('p1', p1)   # p1 <__main__.Person object at 0x0000017DADA7B4E0>
p1.sleep()        # self <__main__.Person object at 0x0000017DADA7B4E0>


p2 = Person()
p2.name = '小花'
p2.sleep()        # 小花睡覺!  跑

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

  • 0.魔法方法:python類中鳞仙,用__開頭及結(jié)尾的方法寇蚊,就是魔法方法,魔法方法不需要主動(dòng)調(diào)用棍好,都會(huì)自動(dòng)調(diào)用仗岸。

  • 1._init_方法
    a.是對(duì)象方法,可用對(duì)象調(diào)用
    b.不需要自己調(diào)用借笙,會(huì)被自動(dòng)調(diào)用
    c.在創(chuàng)建對(duì)象后扒怖,專門用來對(duì)對(duì)象做初始化。

  • 2.構(gòu)造方法
    概念:函數(shù)名和類名一樣的函數(shù)业稼,就是構(gòu)造方法盗痒。用于創(chuàng)建對(duì)象。
    當(dāng)我們創(chuàng)建類時(shí)低散,系統(tǒng)會(huì)自動(dòng)創(chuàng)建這個(gè)類的構(gòu)造方法俯邓,用來創(chuàng)建對(duì)象。
    當(dāng)我們通過構(gòu)造方法創(chuàng)建對(duì)象時(shí)谦纱,系統(tǒng)會(huì)自動(dòng)調(diào)用init方法來對(duì)創(chuàng)建好的對(duì)象進(jìn)行初始化看成。

注意:
當(dāng)init方法中除了self以外如果需要?jiǎng)e的參數(shù),那么這些參數(shù)是通過構(gòu)造方法傳入的跨嘉。
只要調(diào)用了構(gòu)造方法川慌,就會(huì)產(chǎn)生新的對(duì)象。想要對(duì)象祠乃,就要用構(gòu)造方法梦重。

class Person(object):
    def __init__(self, name, age=0):
        print('self', self)
        print('init方法', name)

"""
def Person(*args, **kwargs):
    在堆中開辟空間創(chuàng)建對(duì)象
    對(duì)象.__init__(*args, **kwargs)
    return 對(duì)象
"""
p0 = Person('abc', 10)
p1 = Person('abc', 10)
print('p1:', p1)

p2 = Person('123', age=20)
print('p2:', p2)
# p3 = Person()
p3 = p1


# 模擬構(gòu)造方法和init方法
def __init__(a, b):
    print('自己實(shí)現(xiàn)', a, b)


def Person1(*args, **kwargs):
    # args = (10, 20)
    print('創(chuàng)建對(duì)象')
    __init__(*args, **kwargs)
    print('返回對(duì)象')


Person1(10, 20)
# 注意
tuple1 = (10, 20)
print(*tuple1)            # 10 20

13.5 對(duì)象屬性

  • 1.什么是對(duì)象屬性
    a.聲明在_init_方法中
    b.self.屬性名 = 值
    c.通過對(duì)象使用: 對(duì)象.屬性
    d.不同的對(duì)象,屬性可能不一樣

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

  • 2.什么樣的屬性應(yīng)該聲明成對(duì)象的屬性
    如果屬性值會(huì)因?yàn)閷?duì)象不同而不一樣,那這樣的屬性就應(yīng)該聲明成對(duì)象屬性.反之聲明成類的字段.
# 情況1:所有對(duì)象屬性創(chuàng)建時(shí)都使用一個(gè)固定的默認(rèn)值
class Person:
    def __init__(self):
        # 這里的name和age就是Person類的對(duì)象屬性.
        self.name = ''
        self.age = 0


# 創(chuàng)建對(duì)象
p1 = Person()
# 使用對(duì)象屬性
p1.name = 'ZH'
print(p1.name)      # ZH
print(p1.age)       # 0

p2 = Person()
p2.name = 'Z'
print(p1.name)      # ZH
print(p2.name)      # Z
print(p1.age)       # 0
print('='*88)


# 情況2:創(chuàng)建對(duì)象時(shí),決定對(duì)象屬性值
class Person:
    def __init__(self, name, age=1):
        # 這里的name和age就是Person類的對(duì)象屬性.
        self.name = name
        self.age = age


# 創(chuàng)建對(duì)象
p1 = Person('ZH')
# 使用對(duì)象屬性
# p1.name = 'ZH'
print(p1.name)      # ZH
print(p1.age)       # 1

p2 = Person('Z')
# p2.name = 'Z'
print(p1.name)      # ZH
print(p2.name)      # Z
print(p1.age)       # 1

# 修改對(duì)象屬性值
p1.name = '流浪法師'
print(p1.name)         # '流浪法師'


# 練習(xí),聲明一個(gè)矩形類
"""
屬性:長和寬
方法:求面積和求周長
"""


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

    # 一個(gè)對(duì)象方法,需不需要除了self以外的其他參數(shù),看實(shí)現(xiàn)這個(gè)函數(shù)的功能需不需要除
    # 了屬性以外的其他數(shù)據(jù).
    def area(self):
        return self.width*self.length

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


j1 = Retangle(30, 20)
print(j1.area())                 # 600
print(j1.perimeter())                 # 100


# 練習(xí):聲明一個(gè)point類,擁有屬性x,y坐標(biāo).擁有的功能是求一個(gè)點(diǎn)到另一個(gè)點(diǎn)的距離
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    # def distance(self, x1, y1):
    #     return ((self.x-x1)**2 + (self.y-y1)**2)**0.5
    def distance(self, other):
        return ((self.x-other.x)**2 + (self.y-other.y)**2)**0.5


p1 = Point(1, 2)
p2 = Point(4, 6)

# p1_p2 = p1.distance(p2.x, p2.y)
# print(p1_p2)                      # 5.0
print(p1.distance(p2))              # 5.0

13.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ì)象屬性的值)

獲取指定對(duì)象指定的屬性
a.對(duì)象.屬性名 - 屬性不存在時(shí)會(huì)報(bào)錯(cuò)
b.getattr(對(duì)象,'屬性名',默認(rèn)值) - 當(dāng)屬性不存在時(shí),如果設(shè)置了默認(rèn)值,不會(huì)崩潰,會(huì)返回默認(rèn)值.

print(dog1.name)                      # 旺財(cái)
# print(dog1.name1) # AttributeError: 'Dog' object has no attribute 'name1'

print(getattr(dog1, 'name'))              # 旺財(cái)
print(getattr(dog1, 'name1', '菜菜'))         # 菜菜
  • 2.增\改

a.對(duì)象.屬性 = 值
b.setattr(對(duì)象,屬性名,值)

注意:屬性存在時(shí),對(duì)應(yīng)的功能是修改屬性值.當(dāng)屬性不存在時(shí),是添加屬性.

dog1.name = '大黃'
print(dog1.name)          # 大黃;改
dog1.sex = '母'
print(dog1.sex)           # 母;增

setattr(dog1, 'name', 'hotdog')
print(dog1.name)                             # hotdog;改
setattr(dog1, 'name2', 'roudog')
print(dog1.name2)                            #  roudog;增
  • 3.刪除

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

del dog1.name
# print(dog1.name)     # AttributeError: 'Dog' object has no attribute 'name'

注意:對(duì)象屬性的增刪改查都是針對(duì)指定的那一個(gè)對(duì)象,不會(huì)影響其他對(duì)象

  • 4.slot魔法
__slots__是用來約束當(dāng)前這個(gè)類有哪些對(duì)象屬性
class Student:
    # Student類的對(duì)象只能有name age id sex這幾個(gè)只能少,不能多
    __slots__ = ('name', 'age', 'id', 'sex')   # 限制類的屬性

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


stu1 = Student('小明', 18)
# stu1.neme = '666'       # 因?yàn)橛衧lots魔法,所以不能添加
stu1.sex = '666'          # 可以添加,且不影響其他對(duì)象

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

  • 1.類的字段
    a.聲明在類中且在函數(shù)外的變量,叫做類的字段.
    b.類的字段需要通過類來使用:類.字段 - 不論是在類中還是類外,都需要。
    類的字段:不會(huì)因?yàn)閷?duì)象不同而不一樣的數(shù)據(jù)就聲明為類的字段
class Person:
    # 聲明了一個(gè)字段number
    number = 61

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


print(Person.number)           # 61
  • 2.內(nèi)置類屬性
    內(nèi)置屬性就是聲明類的時(shí)候,類中已經(jīng)聲明好的屬性(包含類的字段和對(duì)象屬性),
class Dog:
    """說明文檔:傻狗"""
    # 類的字段
    type = '犬科'

    # 聲明對(duì)象屬性
    def __init__(self, name, color, age):
        self.name = name
        self.color = color
        self.age = age

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

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

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


dog1 = Dog('小黑', 3, '黑色')

a._name_
類._name_ - 獲取類的名字(字符串)

print(Person.__name__)               # Person;獲取類的名字

b._class_
對(duì)象._class_ - 獲取對(duì)象對(duì)應(yīng)的類(結(jié)果是一個(gè)類,類能做的它都可以做)

print(Person.__class__)        #   <class 'type'>
print(dog1.__class__)          #  <class '__main__.Dog'>

dog1 = Dog('小黑', 3, '黑色')
dog2 = dog1.__class__('小黑', 3, '黑色')  # 可以創(chuàng)建對(duì)象
print(dog1.__class__.__name__)  # 有一個(gè)類的對(duì)象,可以獲取到類的名字

c._dict_
(了解)類._dict_ - 獲取當(dāng)前類的所有字段及其對(duì)應(yīng)的值
(重點(diǎn))對(duì)象._dict_ - 將當(dāng)前對(duì)象所有的對(duì)象屬性及其值轉(zhuǎn)換成字典,key是屬性名,value是屬性值.(數(shù)據(jù)本地化必須操作)

print(Dog.__dict__)     # 獲取類的所有字段和其地址組成的字典
print(dog1.__dict__)     # {'name': '小黑', 'color': 3, 'age': '黑色'}

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

print(Dog.__bases__)      # (<class 'object'>,)元組;python支持多繼承,所以為元組

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

print(Dog.__module__)  #  __main__

f._doc_
類._doc_ - 獲取類的說明文檔

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)場離奇詭異,居然都是意外死亡沛膳,警方通過查閱死者的電腦和手機(jī)扔枫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锹安,“玉大人短荐,你說我怎么就攤上這事√究蓿” “怎么了忍宋?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長风罩。 經(jīng)常有香客問我糠排,道長,這世上最難降的妖魔是什么泊交? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任乳讥,我火速辦了婚禮柱查,結(jié)果婚禮上廓俭,老公的妹妹穿的比我還像新娘。我一直安慰自己唉工,他們只是感情好研乒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淋硝,像睡著了一般雹熬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谣膳,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天竿报,我揣著相機(jī)與錄音,去河邊找鬼继谚。 笑死烈菌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的花履。 我是一名探鬼主播芽世,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼诡壁!你這毒婦竟也來了济瓢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤妹卿,失蹤者是張志新(化名)和其女友劉穎旺矾,沒想到半個(gè)月后蔑鹦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡箕宙,尸身上長有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
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肤寝。 院中可真熱鬧当辐,春花似錦、人聲如沸鲤看。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽义桂。三九已至找筝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慷吊,已是汗流浹背袖裕。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溉瓶,地道東北人急鳄。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像嚷闭,于是被迫代替她去往敵國和親攒岛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • 一胞锰、面向?qū)ο缶幊?編程思想:1.面向過程編程 ---> 算法灾锯,邏輯(數(shù)學(xué)邏輯) 2.函數(shù)式編程 ---> 函數(shù),...
    龍神海王閱讀 154評(píng)論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,090評(píng)論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,334評(píng)論 8 265
  • 周末觀展嗅榕。在《水月觀音》前顺饮,一對(duì)父子闖入視野吵聪。 父問子:“畫里的月亮在哪里?” 兒子順手指向月亮的方向兼雄。父又問:“...
    雪花雪語閱讀 230評(píng)論 0 1
  • 去年這個(gè)時(shí)候送丹丹回去的吟逝,今年,丹丹一個(gè)人回去了赦肋。 細(xì)細(xì)想來块攒,丹丹和我一起的幾個(gè)月里,沒有和我吐露過心事佃乘,我覺得主...
    西瓜太郎輕羽飛揚(yáng)閱讀 150評(píng)論 0 0