Python的高级特性8:你真的了解类,对象,实例,方法吗

时间:2023-12-11 16:45:08

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,后续再说,不是本节重点。