【Lemon】python的面向對象

目錄

類class

類屬性和實例屬性

類屬性的分類

關於如何在類裏面定義對象屬性

__init__方法

類裏面的方法

類方法,靜態方法,實例方法的應用場景


類class

1. 類的定義

關鍵字:class

語法:

class 類名:

    # 類裏面的代碼

 

類名命名規範:遵循標識符的命名規範,風格採用大駝峯命名法,例如CatType

 

  1. 類定義的兩種方式

# 這兩種定義類的方式無差別

# 類定義的第一種方式:不寫繼承的父類,默認繼承object。

class MyTest:

    pass



# 類定義的第二種方式:在類名的括號後面指定繼承object這個類。

class MyClass(object):

    pass

 

# object: python中所有類的基類(祖宗類)

 

 

示例:

class Cat:

    pass



class Dog:

    pass



class TestCase:

    pass

 

2. 通過類創建對象

對象 = 類名()

關於對象,有人叫對象,也有人叫實例。

通過類來創建對象(實例化對象)。可以創建多個對象,每個對象的內存地址都不一樣。

示例:

class Cat:

    pass



# 通過類來創建對象(實例化對象)。可以創建多個對象,每個對象的內存地址都不一樣。

kitty = Cat()

print(id(kitty)) # 輸出結果:2108715911296



coffee = Cat()

print(id(coffee)) # 輸出結果:2108716016880

 

類屬性和實例屬性

  1. 類屬性

這一類事物擁有的共同特徵,我們通常會定義爲類屬性。

在類裏面直接定義的變量,叫做類屬性。

類屬性:可以通過類和對象去訪問

 

有兩種方式可以訪問類屬性:

    通過對象訪問類屬性:對象名.屬性名。

    通過類訪問屬性:類名.屬性名。

 

示例:

class Cat:

    # 類屬性

    leg = '四條腿'

    tail = '長尾巴'



# 通過對象訪問類屬性:對象名.屬性名

kitty = Cat()

print(kitty.leg) # 輸出結果:四條腿



coffee = Cat()

print(coffee.tail) # 輸出結果:長尾巴



# 通過類訪問屬性:類名.屬性名

print(Cat.leg)  # 輸出結果:四條腿

 

 

  1. 實例屬性

每個對象的屬性值都有可能不一樣,就應該定義爲實例屬性(對象屬性)。

實例屬性的定義:對象.屬性名=屬性值。

對象屬性(實例屬性):只能對象自己能用。

示例:

class Cat:

    # 類屬性

    leg = '四條腿'

    tail = '長尾巴'



# 實例化對象

kitty = Cat()

coffee = Cat()



# 給對象添加屬性

kitty.name = 'kitty'

kitty.age = 2



coffee.name = 'coffee'

coffee.age = 3



# 通過對象訪問對象屬性:對象名.屬性名

print(kitty.name) # 輸出結果:kitty

print(kitty.age) # 輸出結果:2



print(coffee.name) # 輸出結果:kitty

print(coffee.age) # 輸出結果:3

 

類屬性的分類

類屬性的分類:

    1. 公有屬性:既可以在類內部使用,又可以在類的外部被調用。

    2. 私有屬性:使用雙下劃線開頭。只能在類外部使用,在類外面無法被調用。

 

示例:

class Cat:

    # 公有屬性

    attr = 'I have tail'

    # 私有屬性

    __attr = 'I have 4 legs'



    def print_attr(self):

        print('在類的內部訪問公有屬性', self.attr)

        print('在類的內部訪問公有屬性', self.__attr)



Kitty = Cat()



print('在類的外部訪問公有屬性', Kitty.attr)



# 在類外部調用私有屬性會報錯: AttributeError: 'Cat' object has no attribute '__attr'

# print('在類的外部訪問公有屬性', Kitty.__attr)



Kitty.print_attr()

 

關於如何在類裏面定義對象屬性

定義在類裏面的函數叫方法。

__init__方法:

    初始化方法;

    在創建對象的時候,會自動調用執行裏面的代碼。

關於方法中的第一個參數self:self代表對象,不用手動傳參,調用該方法時會自動傳入。

示例:

class Cat:

    # 類屬性

    leg = '四條腿'

    tail = '長尾巴'

    def __init__(self):

        # 初始化方法

        print('這裏是打印self', id(self), self)

        print('這個是__init__方法在調用')



kitty = Cat() # 輸出結果:這裏是打印self 1396410304640 <__main__.Cat object at 0x00000145208A4880>

print('這裏是打印kitty', id(kitty), kitty)

# 輸出結果:這裏是打印self 1396410304640 <__main__.Cat object at 0x00000145208A4880>



print('----------------------')



coffee = Cat() # 輸出結果:這裏是打印self 2197480466656 <__main__.Cat object at 0x000001FFA40AE8E0>

print('這裏是打印coffee', id(coffee), coffee)

# 輸出結果:這裏是打印coffee 1796880263392 <__main__.Cat object at 0x000001A25E68E8E0>

 

__init__方法

__init__方法的作用:初始化對象屬性

示例:

class Cat:

    # 類屬性

    leg = '四條腿'

    tail = '長尾巴'

    def __init__(self, name, age, gender):

        self.name = name

        self.age = age

        self.gender = gender



kitty = Cat('hello kitty', 1, 'female')

print(kitty.name)



coffee = Cat('coffee cat', 2, 'male')

print(kitty.age)

 

類裏面的方法

特徵 + 行爲

特徵:屬性(類屬性和實例屬性)

行爲:方法(類方法和實例方法)

方法的本質就是類裏面的函數。

 

 

實例方法:

    第一個參數時self, self代表的是對象本身,哪個對象調用該方法,self就代表哪個對象。

    實例方法只能通過對象去調用。

    實例方法不能通過類去調用,調用會報錯。

 

類方法:

    @classmethod進行裝飾(標識);

    第一個參數時cls, cls代表的是類本身。

    可以通過類和對象去調用。

 

靜態方法:

    @staticmethod進行裝飾;

    可以通過類和對象去調用。

 

示例:

class Cat:

    # 類屬性

    leg = '四條腿'

    tail = '長尾巴'

    def __init__(self, name, age, gender):

        self.name = name

        self.age = age

        self.gender = gender



    # 實例方法

    def skill_01(self, skill_name):

        print('{}會{}!'.format(self.name, skill_name))



    # 實例方法

    def skill_02(self):

        print('{}會爬樹!'.format(self.name))



    @classmethod

    def class_method(cls):

        print('這是一個類方法!')

        print('打印cls', cls)



    @staticmethod

    def static_method():

        print('這是一個靜態方法!')



# 通過對象調用實例方法

kitty = Cat('hello kitty', 1, 'female')

kitty.skill_01('跳舞')

coffee = Cat('coffee cat', 2, 'male')

coffee.skill_02()

# 通過類迪調用實例方法

# Cat.skill_02() # 報錯:TypeError: skill_02() missing 1 required positional argument: 'self'

print('-------------------------')

# 通過類訪問類方法:類名.類方法名

Cat.class_method()

# 通過對象調用類方法:對象名.類方法名

kitty.class_method()

print('-------------------------')

# 通過類訪問靜態方法:類名.類方法名

Cat.static_method()

# 通過對象調用靜態方法:對象名.類方法名

kitty.static_method()

 

類方法,靜態方法,實例方法的應用場景

類方法:在方法內部只會使用到類屬性。

靜態方法:方法內部既不會使用類相關的屬性和方法, 也不會使用實例(對象)相關的屬性和方法。

實例方法:在方法內部會使用到對象相關的屬性或方法,那麼適合定義爲對象方法。

示例:

class Cat:

    # 類屬性

    leg = '四條腿'

    tail = '長尾巴'



    def __init__(self, name, age, gender):

        # 實例(對象)屬性

        self.name = name

        self.age = age

        self.gender = gender



    # 實例方法

    def skill_01(self):

        print('{}會跳舞!'.format(self.name))

        self.move()

    def move(self):

        print('快速移動')



    # 類方法

    @classmethod

    def class_method(cls):

        print('這是貓類的共同特徵:{}{}!'.format(cls.leg, cls.tail))

        print('打印cls', cls)



    #靜態方法

    @staticmethod

    def static_method():

        print('裏面的代碼和類和對象沒有太多相關性!')



kitty = Cat('kitty', 1, 'female')

kitty.skill_01()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章