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,后續再說,不是本節重點。