Python類(創建對象的藍圖) -*- Python基礎知識10 -*-

類的簡介

類是一個創建對象的圖紙,同時類本身也是一個對象,簡單的說類就是一個創建對象的對象(類本身是一個type類型的對象)

class Prople:
    pass
print(type(Prople)) # <class 'type'>

類的創建、使用方法

創建方法

用class關鍵字來定義,根據約定類名首字母大寫
語法

 class 類名([父類]):
            公共屬性
            
            對象的初始方法
            def __init__(self):
                ...            
            def 方法1 (self):
                ...
            def 方法2 (self):
                ...

使用方法

被類賦值的變量稱之爲類的實例
類中的變量稱之爲屬性
類中的函數稱之爲方法
在類的中我們可以定義屬性和方法,在類中定義的內容會變成所有實例的公共內容。
通過(實例.屬性名 = 屬性值)可以改變此實例屬性
通過(實例.方法名)來調用
通過isinstance(變量,類名)來驗證變量是否在此類中。

class Prople:
    name = '尋覓'
    def eat(self):
        print('%s很能吃' %self.name)

a = Prople()
b = Prople()
# 通過(實例.屬性名 = 屬性值)可以改變此實例屬性
a.name = '綠巨人'
# 通過(實例.方法名)來調用
a.eat() # 綠巨人很能吃
b.eat() # 尋覓很能吃
# 通過isinstance(變量,類名)來驗證變量是否在此類中。
print(isinstance(a, Prople)) # True

self的含義

在函數中,形參和實參數量相同,但是在方法中形參永遠比實參多一個,如果創建的方面中沒有形參則會報錯。多出的形參爲解釋器自動傳遞,傳遞的值爲調用方法的本身,一般我們會將這個函數命名爲self。

class Prople:
    def eat(self):
        print(self)

a = Prople()
a.eat() # <__main__.Prople object at 0x000001E6DE675610>
print(a) # <__main__.Prople object at 0x000001E6DE675610>

類和實例

當我們調用一個實例的屬性時,解析器會先在當前實例中尋找是否有該屬性,如果有,則直接返回當前實例的屬性值如果沒有,則去當前實例的類對象中去尋找,如果有則返回類對象的屬性在沒有則報錯。
類對象和實例中的屬性和方法不會因爲調用結束而銷燬。
如果這個屬性或方法是所有實例共享,則應該將其保存在類對象中
如果這個屬性或方法是某個實例獨有的,則應該保存到實例對象中

__init__(魔術方法)

魔術方法是一種不需要自己調用的特殊方法,它會在特殊的時候自動調用。
在魔術變量中,我們最常用的就是__init__方法,下面我們就來詳細介紹一下它的用法。

  1. 此魔術方法會在創建實例後立即執行,用來將內部的內容自動存入到每個實例之中
class Prople:

    def __init__(self):
        self.name = '尋覓'
        print('我的名字是', self.name)

    def can(self):
        print('我很能吃')


data = Prople()
data.can() # 我的名字是 尋    我很能吃
#這裏會把self中的內容輸出

將屬性放入__init__和將屬性直接放入class中雖然看似效果相同,但實際兩種方法在處理中卻截然不同。
如果直接將屬性放入類中,屬性會變爲類中的公共屬性,如果修改此公共屬性,則公共屬性被改變,使用此類創建的實例中此屬性也會被改變,而在__init__中的屬性則會自動放入每個實例中,及時在某個實例中此屬性被修改,也不會影響到其他調用此類創建的實例對象。
我會專門寫一篇關於各種魔術方法的介紹和用處,需要的話可以關注我的博客。

屬性與方法

類屬性

自己在類中定義的屬性。可以直接通過類來訪問(類.屬性),類的實例化對象可以訪問類屬性,類屬性只能通過類對象來修改,無法通過實例對象來修改

class Prople:
    name = '尋覓'
    def eat(self):
        print('%s很能吃' % self.name)
a = Prople()
a.name = '測試'
a.eat()
print(a.name, Prople.name) # 測試 尋覓

實例屬性

通過類對象添加的屬性。只能通過實例對象來訪問和修改,無法使用類對象訪問或修改。

實例方法

在類中定義,以self爲參數的方法都是實例方法。 => (類.方法(實例) 等價於 實例.方法())

class Prople:
    def __init__(self):
        self.name = '尋覓'
    def can(self):
        print('%s很能吃' % self.name, self)
data = Prople()
data.can() # 尋覓很能吃 <__main__.Prople object at 0x000001A3F6856C40>
Prople.can(data) # 尋覓很能吃 <__main__.Prople object at 0x000001A3F6856C40>

類方法

在類的內部使用@classmethod 來修飾的方法叫做類方法。類方法可以跳過實例,直接通過類進行調用。
(在實例方法中第一個參數爲self,而在類方法中第一個參數爲cls 。注意: cls和self一樣,並不是強制性的命名)
cls是當前類對象

靜態方法

在類內部使用@staticmethod來裝飾的方法屬於靜態方法,靜態方法不需要指定任何參數,可以通過類和實例去調用。

class Prople(object):
    name = '尋覓'
    @classmethod
    def eat(cls):
        print('%s賊能吃' % cls.name, cls)
    @staticmethod
    def can():
        print('能睡很久')
data = Prople()
data.eat() # 尋覓賊能吃 <class '__main__.Prople'>
Prople.eat() # 尋覓賊能吃 <class '__main__.Prople'>
data.can() # 能睡很久
Prople.can() # 能睡很久
class Animal:

    looks = '各不相同'

    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    # 實例方法
    def sleep(self):
        print('%d歲的%s會睡覺' % (self.__age, self.__name))

    # 類方法
    @classmethod
    def eat(cls):
        # 類方法無法調用實例中的屬性,魔術方法中的屬性在這裏就無法使用
        print('動物吃的東西%s' % cls.looks)

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, name):
        self.__name = name

    # 靜態方法,靜態方法在類中使用很少,靜態方法就相當於把外部的函數放到了類中
    @staticmethod
    def xunmi():
        print('靜態方法不用設置self,他不會向自身傳遞self')


# 類屬性
print(Animal.looks)
cat = Animal('貓', 11)
# 修改實例中的類屬性
cat.looks = '可愛'
# 類屬性沒有改變
print(cat.looks, Animal.looks)
# 只能通過類屬性來修改類屬性
Animal.looks = '多種多樣'
print(Animal.looks)

# 實例屬性
cat.target = '佔領地球'
print(cat.target)
# print(Animal.target)

cat.sleep()
cat.eat()
cat.xunmi()
發佈了53 篇原創文章 · 獲贊 28 · 訪問量 5562
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章