2018-09-06類和對象

01-類和對象

1.理論上的定義
類:就是擁有相同功能和相同屬性的對象的集合 (類是抽象)
對象:類的實(shí)例(對象是具體的)
2.從生活的角度
如果說人是一個類翩概,馬云就是一個對象
如果說電腦是一個類,我桌上的這臺電腦就是一個對象
如果說車是一個類嗽测,具體的一輛車就是一個對象
3.編程思想
面向過程編程:以算法為工具
函數(shù)式編程:以函數(shù)為工具
面向?qū)ο缶幊蹋阂灶惡蛯ο鬄楣ぞ撸嫦蛏睿?/p>

02-類的聲明

類:對擁有相同功能(方法)和相同屬性(屬性)的封裝

封裝效果:一個類中可以對多個功能進(jìn)行封裝(多個函數(shù))糟趾,對多個屬性進(jìn)行封裝
1.類的聲明格式
class 類名(父類列表):
——類的說明文檔
——類的內(nèi)容
2說明:
class:聲明類的關(guān)鍵字
類名:標(biāo)識符洗做,不能是關(guān)鍵字燎竖。駝峰式命名(第一個單詞首字母小寫楼入,其它的單詞首字母大寫)哥捕,首字母大寫!<涡堋遥赚!,見名知義
例如:Person阐肤、StudentSystem
(父類列表):括號與括號里的內(nèi)容可以省略凫佛,這個是繼承語法
冒號:固定的
類的內(nèi)容:包括類的方法和類的屬性
3.類中的方法
方法:聲明在類中的函數(shù)
a.對象方法:對象方法需要對象來調(diào)用,對象孕惜,函數(shù)名()
直接寫在類中的方法愧薛,自帶一個self參數(shù)
b.類方法
c.靜態(tài)方法
4.創(chuàng)建對象
創(chuàng)建類的時候,系統(tǒng)會默認(rèn)給我們創(chuàng)建這個類對應(yīng)的構(gòu)造方法
構(gòu)造方法:類名()--》創(chuàng)建類對應(yīng)的對象


# 創(chuàng)建一個類
class Person:
    '''人類'''
    def eat(self):
        print('人吃飯')



if __name__ == '__main__':
    # 創(chuàng)建對象
    p1 = Person()    # 創(chuàng)建Person類的對象衫画,并且將對象地址存到p1中

    # 一個類可以有多個對象
    p2 = Person()
    # 只有在調(diào)用構(gòu)造方法的時候才會產(chǎn)生新的對象
    p3 = p2
    print(id(p1),id(p2),id(p3))

    # 2.調(diào)用對象
    # 通過對象調(diào)用對象方法毫炉,默認(rèn)參數(shù)self不需要傳參,系統(tǒng)自動傳參
    p1.eat()

03-構(gòu)造方法和init方法

1.構(gòu)造方法:系統(tǒng)自動創(chuàng)建削罩,方法名和類名一樣瞄勾,用來創(chuàng)建對象
2.init:init方法的功能是用來做初始化和添加對象屬性的
當(dāng)我們通過構(gòu)造方法去創(chuàng)建對象的時候,系統(tǒng)會自動調(diào)用init方法(不用主動調(diào)用init方法)

class Dog:
    def __init__(self):
        print('init方法')

class Person:
    # init方法可以添加參數(shù)
    def __init__(self,name,age = 18):
        print(name,age)
        print('人類的init方法')

if __name__ == '__main__':
    # 創(chuàng)建對象的過程:調(diào)用構(gòu)造方法在內(nèi)存中開辟空間創(chuàng)造一個對象弥激,然后用新建的這個對象去調(diào)用init方法进陡,
    #                 來初始化對象的屬性,最后才將對象返回
    dog1 = Dog()
    dog2 = Dog()
    # 如果類的init方法有參數(shù)秆撮,通過給構(gòu)造方法傳參類init方法傳參
    p1 = Person('小明')
    p2 = Person('小紅',20)
    p3 = Person(age = 20,name = '東東')

04-對象屬性

類中的內(nèi)容:屬性和方法
1.屬性:(保存值的)
a.對象的屬性:不同的對象四濒,對應(yīng)的值可能不一樣,這樣的屬性就是對象屬性屬于對象
類中的對象屬性是聲明在init方法中的,并且聲明格式:self.屬性名 = 初值
對象屬性的使用:對象盗蟆,屬性名
b.類的字段:屬于類的戈二,所有的對象對應(yīng)的值是一樣的
2.方法:(保存功能的)
a.對象方法
b.類方法
c.靜態(tài)方法


class Student:
    '''學(xué)生類'''
    def __init__(self):
        # 聲明對象屬性name,age,id
        self.name = '李青'
        self.age = 0
        self.id = '001'

class Dog:
    '''狗類'''
    # 創(chuàng)建Dog的對象的時候,必須傳類型和顏色
    def __init__(self,type1,color1):
        self.type = type1
        self.color = color1

class Computer:
    '''電腦類'''
    # 創(chuàng)建對象的時候可以使用默認(rèn)值喳资,也可以使用自己傳的值
    def __init__(self,color= '白色',memory= 0):
        self.color = ''
        self.memory = 1000

class  rectangle:
    def __init__(self,long= 100,width= 50):
        self.long = long
        self.width = width


if __name__ == '__main__':
    # stu1就是Student類的對象
    stu1 = Student()
    # 通過對象去使用對象的屬性
    print(stu1.name,stu1.age,stu1.id)
    # 通過對象去修改對象的屬性
    stu1.name = 'SB'
    print(stu1.name)
    dog1 = Dog('土狗','黃色')
    print(dog1.type,dog1.color)
    dog2 =Dog('斗狗','黑色')
    print(dog2.type,dog2.color)


    comp1 = Computer()
    print(comp1.color,comp1.memory)
    comp2 = Computer('黑色',512)
    print(comp2.color,comp2.memory)

    sq =  rectangle()
    print(sq.long,sq.width)
    sq =  rectangle(10,5)
    print(sq.long,sq.width)

05-對象屬性的增刪改查

Python是動態(tài)語言觉吭,Python中類的對象的屬性可以進(jìn)行增刪的操作

class Person:
    '''人類'''
    def __init__(self):
        self.name = '李四'
        self.age = 18
        self.height = 160
1.查

方法一:對象.屬性
方法二:def getattr(對象,屬性名仆邓,default=None)
方法三:對象._ getattribute _('height')

print(p1.name)
    # print(p1.nmae2)      # 屬性不存在會報錯

print(getattr(p1,'age2',0))    # 屬性不存在可以通過設(shè)置默認(rèn)值鲜滩,讓程序不崩潰,并且返回默認(rèn)值

 height = p1.__getattribute__('height')
    print(height)
2.改(修改屬性的值节值,屬性存在)

方法一:對象.屬性 = 新值

p1.name = '張三'
    print(p1.name)

方法二:def setattr(對象徙硅,屬性名,新值)

setattr(p1,'age',20)
    print(p1.age)

方法三:對象._ setattr _(屬性名搞疗,新值)

 p1.__setattr__('height',170)
    print(p1.height)
3.增(增加屬性)

注意:添加只能給某一個對象添加對應(yīng)的屬性
方法一:對象.屬性 = 新值

p1.sex = '女'
    print(p1.sex)

方法二:def setattr(對象嗓蘑,屬性名,新值)

 setattr(p1,'weight',55)
    print(p1.weight)

方法三:對象.setattr(屬性名匿乃,新值)

p1.__setattr__('color', '綠色')
    print(p1.color)
    # print(p2.sex)        # 添加只影響一個對象
4.刪(刪除對象屬性)

注意:刪除只針對指定的對象
方法一:del 對象.屬性

del p1.name
    # print(p1.name)      可行

方法二:delattr(對象桩皿,屬性名)

 delattr(p1,'age')
    # print(p1.age)       可行

方法三:對象._ delattr _(屬性名)

 p1.__delattr__('height')
    # print(p1.height)     可行
    print(p2.name,p2.age)

06-對象方法

1.對象方法:
a.什么樣的方法是對象方法:直接聲明在類里面的函數(shù)默認(rèn)是對象方法,有一個默認(rèn)參數(shù)self
b.對象方法要通過對象來調(diào)用:對象.對象方法()
c.對象方法中的默認(rèn)參數(shù)self不需要傳參幢炸,因為在調(diào)用這個方法的時候泄隔,
系統(tǒng)會自動將當(dāng)前對象傳給self,那個對象調(diào)用方法宛徊,self就指向誰

import math
class Circle:
    '''圓類'''
    def __init__(self,radius1):
        self.radius = radius1
    # 聲明了一個對象方法area
    # 在這佛嬉,self就是調(diào)用area方法的對象,對象能做的事情岩调,self都可以做
    def area(self):
        # print(id(self))
        # print('求圓的面積')
        return math.pi * self.radius **2
  • 練習(xí)1:寫一個矩形類巷燥,有屬性長和寬,有兩個功能赡盘,分別是求周長和面積
class Rectangle:
    '''矩形類'''
    def __init__(self,long,width):
        self.long = long
        self.width =width
    # 對象方法是否需要額外參數(shù)号枕,看實(shí)現(xiàn)函數(shù)的功能需不需要除了對象屬性以外的其他數(shù)據(jù)
    def area(self):
        return self.long * self.width
    def perimeter(self):
        return (self.width + self.long) *2
  • 練習(xí)2:寫一個班級類,班級里面有多個學(xué)生的一門成績陨享,班級名葱淳,可以獲取班級成績中的最高分
class Grade:
    '''班級類'''
    def __init__(self,class_name,*grade):
        self.class_name = class_name
        self.grade = grade
        # self.grade = []
    def top_score(self):
        # if not self.grade:
        #     return None
        # max(序列)----》獲取序列中元素的最大值
        # min (序列)----》獲取序列中元素的最小值
        return max(self.grade)
if __name__ == '__main__':
    c1 = Circle(3)
    print(id(c1))
    print('c1的面積',c1.area())


    c2 = Circle(5)
    print('c2的面積', c2.area())

    g1 = Grade('python1806',90,80,70)
    print(g1.class_name)
    print(g1.top_score())

    g2 = Rectangle(10,5)
    print(g2.area())
    print(g2.perimeter())

07-類的字段

1.類的屬性叫類的字段
a.什么是類的字段
類的字段就是聲明在類的里面,方法的外面的變量
b.什么樣的屬性聲明成類的字段:
屬于類的抛姑,對于這個類的所有的對象來說赞厕,其值是一樣的
c.怎么使用
通過類使用:類.字段

class Person:
    # number就是類的字段
    number = 10

練習(xí):寫一個球類,用一個屬性來保存這個類的創(chuàng)建對象的個數(shù)

class Ball:
     count = 0
     # 每次創(chuàng)建球的對象都會調(diào)用init方法定硝,所以調(diào)用init方法的次數(shù)就是Ball創(chuàng)建的對象的個數(shù)
     def __init__(self):
         Ball.count += 1
ball1 = Ball()
ball2 = Ball()
print(Ball.count)

if __name__ == '__main__':
    # 通過類獲取類的字段的值
    print(Person.number)

    Person.number = 70
    print(Person.number)

08-類的方法

類中的方法

  • 1.對象方法(實(shí)例方法)
    聲明的形式:直接聲明在類中
    特點(diǎn):自帶一個不需要主動傳參的默認(rèn)參數(shù)self皿桑,誰來調(diào)用指向誰
  • 2.類方法
    聲明形式:聲明方法前需要使用@classmethod
    特點(diǎn):自帶一個參數(shù)cls,這個參數(shù)調(diào)用的時候不需要傳值,系統(tǒng)自動傳值,誰調(diào)用诲侮,傳給誰镀虐!始終指向當(dāng)前類
    調(diào)用:通過類調(diào)用---》類.類方法()
  • 3.靜態(tài)方法
    聲明的形式:聲明方法前需要使用@staticmethod說明
    特點(diǎn):沒有默認(rèn)參數(shù)
    調(diào)用:通過類來調(diào)用--》類.靜態(tài)方法()
class Class1:

    # 類字段
    number = 10
    # 聲明一個對象方法
    def object_func(self):
        print('對象方法')

    # 聲明一個類方法
    @classmethod
    def class_func(cls):
        # 通過cls去使用類的字段
        print('cls:',cls.number)
        # 通過cls去創(chuàng)建對象
        tc =cls()
        tc.object_func()
        print('這是一個類方法')

    @staticmethod
    def static_func():
        print('這是一個靜態(tài)方法')

c1 = Class1()
# 調(diào)用對象方法
c1.object_func()
print(Class1.number)
# 調(diào)用類方法
Class1.class_func()
# 調(diào)用靜態(tài)方法
Class1.static_func()

4.遇到問題怎么來選擇使用那種方法:

  • a.大前提:只要實(shí)現(xiàn)方法的功能需要用到對象的屬性,我們就使用對象方法沟绪,否則就使用靜態(tài)方法或者類方法
  • b.不使用對象方法的前提下刮便,如果實(shí)現(xiàn)功能需要類的字段就使用類方法
  • c.實(shí)現(xiàn)功能既不需要對象的屬性,又不需要類的字段就使用靜態(tài)方法
    注意:靜態(tài)方法和類方法劃分不嚴(yán)格绽慈,靜態(tài)方法能做的恨旱,類方法可以做,反之成立
class Person:
    # 類的字段坝疼,存儲人類數(shù)量
    number = 61

    @classmethod
    def show_number1(cls):
        print('人類的數(shù)量是:%d億'% cls.number)

    @staticmethod
    def show_number2():
        print('人類的數(shù)量是:%d億'% Person.number)

Person.show_number1()
Person.show_number2()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搜贤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子钝凶,更是在濱河造成了極大的恐慌入客,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腿椎,死亡現(xiàn)場離奇詭異桌硫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)啃炸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門铆隘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人南用,你說我怎么就攤上這事膀钠。” “怎么了裹虫?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵肿嘲,是天一觀的道長。 經(jīng)常有香客問我筑公,道長雳窟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任匣屡,我火速辦了婚禮封救,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捣作。我一直安慰自己誉结,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布券躁。 她就那樣靜靜地躺著惩坑,像睡著了一般掉盅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上以舒,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天怔接,我揣著相機(jī)與錄音,去河邊找鬼稀轨。 笑死扼脐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奋刽。 我是一名探鬼主播瓦侮,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼佣谐!你這毒婦竟也來了肚吏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤狭魂,失蹤者是張志新(化名)和其女友劉穎罚攀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雌澄,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斋泄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了镐牺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炫掐。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖睬涧,靈堂內(nèi)的尸體忽然破棺而出募胃,到底是詐尸還是另有隱情,我是刑警寧澤畦浓,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布痹束,位于F島的核電站,受9級特大地震影響讶请,放射性物質(zhì)發(fā)生泄漏祷嘶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一秽梅、第九天 我趴在偏房一處隱蔽的房頂上張望抹蚀。 院中可真熱鬧,春花似錦企垦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春荧降,著一層夾襖步出監(jiān)牢的瞬間接箫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工朵诫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辛友,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓剪返,卻偏偏與公主長得像废累,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脱盲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

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