類的簡介
類是一個創建對象的圖紙,同時類本身也是一個對象,簡單的說類就是一個創建對象的對象(類本身是一個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__方法,下面我們就來詳細介紹一下它的用法。
- 此魔術方法會在創建實例後立即執行,用來將內部的內容自動存入到每個實例之中
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()