Python的高級特性8:你真的了解類,對象,實例,方法嗎


Python的高級特性1-7系列是本人從Python2過渡3時寫下的一些個人見解(不敢說一定對),接下來的系列主要會以類級為主。

類,對象,實例,方法是幾個面向對象的幾個基本概念,其實我覺得很多人並不是真正了解這一塊。

舉個例子進行測試一下:

In [19]: class A():
   ....:     pass
   ....: 

In [20]: a = A

In [21]: type(a)
Out[21]: classobj

In [22]: class B(object):
   ....:     pass
   ....: 

In [23]: b = B

In [24]: type(b)
Out[24]: type

In [25]: c = A()

In [26]: type(c)
Out[26]: instance

In [27]: d = B()

In [28]: type(d)
Out[28]: __main__.B

你能解釋清楚a,b,c,d以及A,A(),B,B()真正代表什么嗎?

如果可以的話,下面的東西就不用看了。

講解的話用另一個例子吧,因為上述例子沒有涉及到方法,不方便展開。

In [79]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:class A:
:       def __init__(self,name):
:               self.name = name
:       def say(self):
:               return("I am %s" % (self.name))
:    
:a1 = A
:a2 = A("alex")
:--

In [80]: dir(a1)
Out[80]: ['__doc__', '__init__', '__module__', 'say']

In [81]: dir(a2)
Out[81]: ['__doc__', '__init__', '__module__', 'name', 'say']

在這個例子中,a1和A是一個類,self代表一個對象,a2與A("alex")代表一個實例,say()代表方法。可以看到a1這個類本身是不含name屬性的,但有方法屬性(ps:這里必須補充一點,如果有類屬性“xx”,那么a1的屬性列表里是會有“xx”的);a2是一個實例,則有name屬性;self是一個對象,因為不好測量,所以很多人模糊地認為對象就是實例,其實正確說來,對象一個模板,而實例就是這個模板的具體實現,詳細地說,self包含name和say()的屬性和方法,而a2包含name 為 alex以及say()方法;方法的話就不用細說了,這個大家一般不會混淆。

現在看第一個例子就會覺得豁然開朗了吧,除了一個type(A)為什么是type,這個涉及到metaclass,后續再說,不是本節重點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM