2018-09-06 day14 類和對象

1.類的聲明

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

封裝效果:一個類中可以對多個功能進(jìn)行封裝(多個函數(shù));封裝多個屬性

1.類的聲明格式
class 類名(父類列表):
類的說明文檔
類的內(nèi)容

2.說明:
class:聲明類的關(guān)鍵字
類名:標(biāo)識符,不能是關(guān)鍵字。駝峰式命名(第一個單詞首字母其他單詞首字母都大寫),首字母大寫?。?!,見名知義
例如:Person,StudentSystem
(父類列表):這個部分可以省。這個是繼承語法。
冒號:固定的
類的內(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('人吃飯')
# 1.創(chuàng)建對象
p1 = Person() #創(chuàng)建Person類的對象,并且將對象的地址存到p1中
# 一個類可以有多個對象
p2 = Person()
# 只有在調(diào)用方法的時候才會產(chǎn)生新的對象
p3 = p2
print(id(p1),id(p2),id(p3))
#2. 調(diào)用對象方法
# 通過對象調(diào)用對象方法,默認(rèn)參數(shù)self不需要傳參。系統(tǒng)會自動傳
p1.eat()
輸出結(jié)果:
30705232 30705136 30705136
人吃飯
2.構(gòu)造方法和init方法

1.構(gòu)造方法:系統(tǒng)自動創(chuàng)建的,方法名和類名一樣。用來創(chuàng)建對象

  1. init"init方法的功能是用來初始化和添加賦屬性的
    當(dāng)我們通過構(gòu)造方法去創(chuàng)建對象的時候,系統(tǒng)會自動調(diào)用(不用自主調(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方法')
# 創(chuàng)建對象的過程:調(diào)用構(gòu)造方法在內(nèi)存中開辟一個對象,
# 然后用新建的這個對象去調(diào)用init方法,來初始化對象對象的屬性。最后才將對象返回
dog1 = Dog()
#如果類的init方法有參數(shù),通過給構(gòu)造方法傳參
p1 = Person('小明')
p2 = Person('小紅',20)
輸出結(jié)果:
init方法
小明 18
人類的init方法
小紅 20
人類的init方法
3.對象屬性

類中的內(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 = 'coco'
        self.age = 0
        self.id = '001'
class Dog:
    '''狗類'''
    #創(chuàng)建Dog的對象的時候,必須傳類型和顏色
    def __init__(self,type1,color1):
        self.type = type1
        self.color = color1

class Computer:
    '''電腦類'''
    def __init__(self,color = '白色',memory = 0):
        self.color = color
        self.memory = memory


# 練習(xí):寫一個矩形類,擁有屬性長和寬
class Rect:
    def __init__(self,long = 23,width = 20 ):
        self.long = long
        self.width = width





if __name__ == '__main__':
    #stu1就是Student類的對象
    stu1 = Student()
    print(stu1.name,stu1.age,stu1.id)
    #通過對象去修改對象的屬性
    stu1.name = '江秀成'
    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)
輸出結(jié)果:
coco 0 001
江秀成
土狗 黃色
斗狗 黑色
白色 0
黑色 512
4.對象屬性的增刪改查

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

class Person:

    def __init__(self):
        self.name = 'jxc'
        self.age = 28
        self.height = 170

if __name__ == '__main__':
    #1.查(獲取屬性的值)
    p1 = Person()
    """
    方法一:對象.屬性名
    方法二:def getattr(對象, 屬性名, 默認(rèn)值)
    方法三:對象.__getattribute__(屬性名)
    """
    print(p1.name)
    # print(p1.name2)  #屬性不存在會報錯
    print(getattr(p1,'name'))
    print(getattr(p1,'name2',0)) #屬性不存在可以通過設(shè)置默認(rèn)值,讓程序不崩潰,并且返回默認(rèn)值
    print(p1.__getattribute__('height'))

    # 2.改(修改屬性的值)
    """
    方法一:對象.屬性 = 新的值
    方法二:def setattr(對象,屬性名,新值)
    方法三:對象.__setattr__(屬性名,新值)
    """
    p1.name = '李四'


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

    p1.__setattr__('height',160)
    print(p1.height)
    #3.增(添加屬性--屬性不存在)
    # 注意:添加屬性只能給某一個對象添加對應(yīng)的屬性
    """
    方法一:對象.屬性 = 新的值
    方法二:def setattr(對象,屬性名,新值)
    方法三:對象.__setattr__(屬性名,新值)
    """
    p1.sex = '女'
    print(p1.sex)

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

    p1.__setattr__('color','green')
    print(p1.color)

    # 4.刪(刪除對象屬性)
    # 注意:刪除值針對指定的對象
    """
    方法一:del 對象.屬性
    方法二:def delattr(對象, 屬性名)
    方法三:對象.__delattr__(屬性名)
    """
    del p1.name

    delattr(p1,'age')

    p1.__delattr__('height')
輸出結(jié)果:
jxc
jxc
0
170
20
160
女
40
green
5.對象方法

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就指向誰

練習(xí)1:寫一個矩形類,有屬性長和寬,有兩個功能,求面積和周長

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

    def area(self):
        return self.width*self.length

    def perimeter(self):
        return (self.length+self.width)*2
    r1 = Rect(1, 2)
    print(r1.area())

    r2 = Rect(2, 3)
    print(r2.perimeter())
輸出結(jié)果:
2
10
6.類的字段

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

練習(xí):寫一個球類,用一個屬性來保存這個類的創(chuàng)建對象的個數(shù)
class Ball:
    count = 0
    # 每次創(chuàng)建球的對象都會調(diào)用init方法,所以init方法調(diào)用的次數(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)

輸出結(jié)果:
2
7.類的方法

1.對象方法(實例方法)
聲明的形式:直接聲明在類中
特點:自帶一個不需要主動傳參的默認(rèn)參數(shù)self,誰來調(diào)用指向誰
調(diào)用:通過對象來調(diào)用

2.類方法
聲明的形式:聲明方法前需要使用@classmethod
特點:自帶一個默認(rèn)參數(shù)cls,這個參數(shù)調(diào)用的時候不需要傳值。系統(tǒng)自動給他傳。誰調(diào)用就指向誰!始終指向當(dāng)前類
調(diào)用:通過類來調(diào)用->類.類方法名()

3.靜態(tài)方法
聲明形式:聲明方法前需要使用@staticmethod說明
特點:沒有默認(rèn)的參數(shù)
調(diào)用:通過類來調(diào)用 -> 類.靜態(tài)方法()
4.遇到問題怎么來選擇使用哪種方法:
a.大前提:只要實現(xiàn)方法的功能需要用到對象的屬性,我們就使用對象方法。否則就使用靜態(tài)方法或者類方法
b.你不使用對象方法的前提下,如果實現(xiàn)功能需要用到類的字段就使用類方法
c.實現(xiàn)功能既不需要對象的屬性,又不需要類的字段就使用靜態(tài)方法
注意:靜態(tài)方法和類方法劃分不用那么嚴(yán)格,靜態(tài)方法能做的類方法可以做,反之亦然

class Person:
    #類字段
    number = 100
    #聲明一個對象方法
    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 = Person()
c1.object_func()
print(Person.number)
# 調(diào)用類方法
Person.class_func()
# 調(diào)用靜態(tài)方法
Person.static_func()

class Person:
#     類的字段,存儲人類的數(shù)量
    number = 61
    @classmethod
    def shou_numer(cls):
        print('人類的數(shù)量是:%d億'%cls.number)

    @staticmethod
    def show_numer2():
        print('人類的數(shù)量是:%d億'%Person.number)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、理論上的定義: 類:就是擁有相同功能和屬性的對象的集合。(抽象)對象:類的實例(具體) 2、從生活角度 如果說...
    Deathfeeling閱讀 153評論 0 1
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,672評論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,262評論 8 265
  • 今天休年假,給阿婆也放放假,我自己帶小妞。昨天就在想帶她去哪玩,大公園、桂花公園,古典園林并不在一開始的計劃中,畢...
    HelenHuang閱讀 594評論 1 0
  • 對于這世上的看法,不管何時?如你開口。說得‘傻點’,‘瘋點’,‘狂妄點’……這事就沒完!對于這世上的看法,不管何時...
    外墻涂料謝寶林閱讀 266評論 0 0

友情鏈接更多精彩內(nèi)容