示例:

class Person:
country = "China"
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self, word):
print(word)其中 country 是類屬性,即 Person類 的靜態(tài)屬性,speak() 為 Person類的函數(shù)屬性,即類的動(dòng)態(tài)屬性~
對(duì)上述示例的類進(jìn)行實(shí)例化:
>>> p = Person('Kitty', 18) # 實(shí)例化 Person類,得到對(duì)象 p
>>> p.name # 調(diào)用對(duì)象 p 的name屬性
'Kitty'
>>> p.speak('hello') # 調(diào)用對(duì)象 p 的綁定方法
hello類中的 __init__ 方法用于初始化對(duì)象,而在類的是實(shí)例化過程中,對(duì)應(yīng)類中第一個(gè)被調(diào)用的并不是 __init__ 方法,第一個(gè)被調(diào)用的是 __new__方法。在對(duì)象的初始化之前首先要?jiǎng)?chuàng)建對(duì)象,__new__方法正是用來創(chuàng)建這個(gè)對(duì)象~
?
類的實(shí)例化過程也可以通過如下語句來實(shí)現(xiàn):
>>> p = object.__new__(Person) # __new__方法繼承自 object類
>>> Person.__init__(p, 'Kitty', 18)
>>> p.name
'Kitty'在Person類中重寫 __new__方法:
class Person:
country = "China"
def __new__(cls, name, age):
print('__new__ called')
return super(Person, cls).__new__(cls)
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self, word):
print(word)
p = Person('Kitty', 18) # 實(shí)例化對(duì)象
print('name : %s' % p.name)
# 輸出結(jié)果:
__new__ called
name : Kitty很明顯 __new__方法 是先于 __init__ 方法被調(diào)用的~
類的實(shí)例化過程大致步驟如下:
1、p = Person('Kitty', 18) ,會(huì)調(diào)用 Person類的__new__方法,并傳遞 name 和 age 參數(shù)
2、__new__方法 會(huì)創(chuàng)建一個(gè) Person類的對(duì)象并返回
3、最后利用這個(gè)對(duì)象調(diào)用類的 __init__ 方法 完成初始化,__init__ 方法的第一個(gè)參數(shù)是self,對(duì)象在調(diào)用 __init__ 方法時(shí)會(huì)將自己當(dāng)做參數(shù)傳遞給 這個(gè)self。
?
注意:__init__方法沒有返回值~,__init__ 方法僅完成對(duì)象的初始化工作~
?
self是什么?
在類的內(nèi)部,self 就是一個(gè)對(duì)象。使用對(duì)象調(diào)用方法時(shí)(對(duì)象的綁定方法),當(dāng)前對(duì)象會(huì)被自動(dòng)傳遞給 self,即 self 表示調(diào)用該方法的對(duì)象~
操作類的變量屬性:
>>> Person.country # 調(diào)用類屬性
'China'
>>> Person.country = 'USA' # 修改類屬性
>>> Person.country
'USA'
>>> del Person.country # 刪除類屬性
>>> Person.country # 刪除后無法再調(diào)用
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'Person' has no attribute 'country'調(diào)用類的函數(shù)屬性:
這里僅介紹綁定方法的調(diào)用(即第一個(gè)參數(shù)是self的方法),類中的其他方法暫先不做介紹~
?
speak() 是類的函數(shù)屬性,對(duì)象調(diào)用不需要傳遞 self參數(shù)(對(duì)象調(diào)用 會(huì)自動(dòng)完成self參數(shù)傳值,下面會(huì)介紹),若是類來調(diào)用,則需要手動(dòng)傳遞這個(gè) self參數(shù),即需要傳遞一個(gè)Person類的對(duì)象~
class Person:
country = "China"
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self, word):
print(word)
p = Person('Kitty', 18)
p.speak('hello') # 對(duì)象調(diào)用,會(huì)自動(dòng)將 對(duì)象p 作為第一個(gè)參數(shù)傳遞給 self
Person.speak(p, '你好') # 類調(diào)用需要手動(dòng)傳遞 self 的值
# 輸出結(jié)果:
hello
你好類名.__dict__ 用來查看一個(gè)類(或?qū)ο螅┑拿Q空間,可以這樣理解。其實(shí)__dict__是類的一個(gè)內(nèi)置屬性,存儲(chǔ)所有實(shí)例共享的變量和函數(shù)(類屬性,方法等),類的__dict__并不包含其父類的屬性。對(duì)象中的 __dict__ 屬性下面會(huì)介紹~
?
這里注意和 dir() 方法的區(qū)別,dir(類名或?qū)ο竺? 會(huì)返回一個(gè)類(或?qū)ο螅┑乃袑傩裕◤母割愔欣^承的屬性。
Person類的__dict__屬性
{'__module__': '__main__', # 所處模塊
'__init__': <function Person.__init__ at 0x11023b378>, # __init__方法
'speak': <function Person.speak at 0x11023b400>, # speak 方法
'__dict__': <attribute '__dict__' of 'Person' objects>, # 應(yīng)該就是指 類的__dict__屬性,具體參閱:https://blog.csdn.net/lis_12/article/details/53519060
'__weakref__': <attribute '__weakref__' of 'Person' objects>,
'__doc__': None} # # class說明文檔調(diào)用類的屬性,首先會(huì)去類的名稱空間中(Person.__dict__)尋找對(duì)應(yīng)名稱的key,相當(dāng)于Person.__dict__['country'],也可以直接這樣調(diào)用:
>>> Person.__dict__['country']
'China'
>>> Person.__dict__['country'] = 'USA'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'mappingproxy' object does not support item assignment注意:
__dict__ 對(duì)于類中的屬性只能查看,不能修改~
除了 __dict__,Python中的類還有很多別的內(nèi)置屬性:
__doc__ :類的說明
__name__: 類名
__module__: 類定義所在的模塊
__bases__ : 包含了類的所有父類 的元組
?
示例如下:
class Person:
'''human being'''
country = "China"
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self, word):
print(word)
print(Person.__doc__)
print(Person.__name__)
print(Person.__module__)
print(Person.__bases__)
#結(jié)果輸出:
human being
Person
__main__
(<class 'object'>,)
class Person:
country = "China"
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self, word):
print(word)實(shí)例化一個(gè)Person類的對(duì)象 的過程中,init方法會(huì)將參數(shù)賦值給 name 與 age 屬性,可以通過 實(shí)例的__dict__ 查看,注意:實(shí)例的__dict__ 僅存儲(chǔ)與該實(shí)例相關(guān)的實(shí)例屬性,沒有函數(shù)屬性,也沒有共有屬性~
>>> p = Person('Kitty', 18)
>>> print(p.__dict__)
{'name': 'Kitty', 'age': 18}注意 實(shí)例.__dict__ 與 類.__dict__ 的區(qū)別~
?
通過 類.__dict__ 可以查看類中的屬性,但是不能修改,但是通過 實(shí)例.__dict__ 除了查看,還可以進(jìn)行修改~
>>> p.__dict__['name']
'Kitty'
>>> p.__dict__['age']
18
>>> p.__dict__['name'] = 'abc'
>>> p.__dict__['age'] = 20
>>> p.name
'abc'
>>> p.age
20通過對(duì)象可以直接調(diào)用該對(duì)象的變量屬性,例如 p對(duì)象 的 name屬性 和 age屬性~
>>> p = Person('Kitty', 18)
>>> p.name
'Kitty'
>>> p.age
18也可以通過 p對(duì)象 調(diào)用對(duì)應(yīng)類(這里是Person類)的變量屬性,若是類的變量屬性發(fā)生變化,則所有對(duì)象獲取到的類變量屬性都會(huì)改變~
>>> p.country
'China'
>>> Person.country = 'UK' # 修改 類的變量屬性
>>> p2 = Person('baby', 22)
>>> p.country
'UK'
>>> p2.country
'UK'Tip:
注意1
在修改類的變量屬性時(shí),若變量是不可變類型,則僅能通過 類名.變量屬性 來修改,如下示例:
>>> Person.country = 'USA' # 修改類屬性
>>> p.country
'USA'
>>> p.country = 'UK'
>>> p.country
'UK'
>>> Person.country
'USA'
>>> p2.country
'USA'p.country 并沒有修改類屬性,而是給自己添加了一個(gè)新的屬性,這個(gè)新添加的屬性存放在對(duì)象自己的名稱空間中,類的變量屬性 country 并沒有發(fā)生改變~
>>> p.__dict__
{'country': 'UK', 'age': 20, 'name': 'abc'}在類中 self 表示當(dāng)前調(diào)用的對(duì)象,當(dāng) self 引用的變量和類變量同名的時(shí)候,需要注意區(qū)分:這兩個(gè)變量之間沒有關(guān)聯(lián),self 引用的變量屬于對(duì)象,放在對(duì)象的名稱空間中,類變量則放在類名稱空間中
class Person:
country = "China"
def __init__(self, name, age):
self.name = name
self.age = age
self.country = 'AUS' # 添加對(duì)象屬性
def speak(self):
print(self.country)
############
>>> p = Person('Kitty', 18)
>>> p.country
'AUS'
>>> p.speak()
AUS
>>> Person.country
'China'注意2
當(dāng)類變量為可變類型時(shí),需要區(qū)分對(duì)象的 2種 操作:
class Person:
country = "China"
lst = []
def __init__(self, name, age):
self.name = name
self.age = age
self.lst.append(name)
def speak(self):
print(self.name)
############
>>> p = Person('Kitty', 18)
>>> p.__dict__
{'age': 18, 'name': 'Kitty'}
>>> Person.lst
['Kitty']上述示例中,self 針對(duì) lst 變量并不是一個(gè)賦值操作,而是調(diào)用了 lst的append方法,所以這個(gè)過程會(huì)先在對(duì)象的名稱空間中尋找 lst 屬性,對(duì)象的名稱空間中沒有,然后再去類的名稱空間中尋找,Person類中存在該屬性,于是調(diào)用其 append 方法。
?
這個(gè)過程通過對(duì)象修改了類的可變類型的變量~
?
若 self 針對(duì) lst 變量是一個(gè)賦值操作,這樣就為當(dāng)前對(duì)象新增了一個(gè) lst 屬性
class Person:
country = "China"
lst = []
def __init__(self, name, age):
self.name = name
self.age = age
self.lst = name
def speak(self):
print(self.name)
############
>>> p = Person('Kitty', 18)
>>> p.__dict__
{'age': 18, 'name': 'Kitty', 'lst': 'Kitty'}
>>> Person.__dict__
{'__module__': '__main__', 'country': 'China', 'lst': [], '__doc__': None, '__init__': <function __init__ at 0x105f5fc08>, 'speak': <function speak at 0x105f5c0c8>}class Person:
country = "China"
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
print(self.name + ', ' + str(self.age))
############
>>> p1 = Person('Kitty', 18)
>>> p2 = Person('baby', 22)
>>> p1.__dict__
{'age': 18, 'name': 'Kitty'}
>>> p2.__dict__
{'age': 22, 'name': 'baby'}可以看到對(duì)象的名稱空間中沒有函數(shù)屬性,函數(shù)屬性在類的名稱空間當(dāng)中
?
>>> Person.speak
<unbound method Person.speak>
>>> p1.speak
<bound method Person.speak of <__main__.Person instance at 0x105f727a0>>
>>> p2.speak
<bound method Person.speak of <__main__.Person instance at 0x105f728c0>>p1 和 p2 的 speak 方法為綁定方法(bound method),且 p1 和 p2 的 speak 方法內(nèi)存地址不一致,這兩個(gè)對(duì)象的 speak 方法都執(zhí)行 類中對(duì)應(yīng)的方法。
綁定方法,有兩種:綁定到類的方法和綁定到對(duì)象的方法,上述示例中的方法為后者,綁定到對(duì)象的方法為對(duì)象專門定制,使用對(duì)象調(diào)用的時(shí)候,會(huì)自動(dòng)將 當(dāng)前對(duì)象傳遞給方法的第一個(gè)參數(shù)(self,一般都叫self,也可以寫成別的名稱),若使用類調(diào)用,則第一個(gè)參數(shù)需要手動(dòng)傳值~
>>> p1.speak()
Kitty, 18
>>> p2.speak()
baby, 22
>>> Person.speak(p1) # 通過類調(diào)用
Kitty, 18這里僅對(duì)綁定到對(duì)象的方法做簡(jiǎn)單介紹,類中還有綁定到類的方法,還有非綁定方法等...,之后會(huì)介紹
.................^_^
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前名稱:簡(jiǎn)述Python中的類與對(duì)象-創(chuàng)新互聯(lián)
本文地址:http://chinadenli.net/article4/cochoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、用戶體驗(yàn)、關(guān)鍵詞優(yōu)化、定制網(wǎng)站、企業(yè)建站、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容