class A():
pass
a = A
type(a)
type
class B(object):
pass
b = B
type(b)
type
c = A()
type(c)
__main__.A
d = B()
type(d)
__main__.B
能解释清楚 a , b , c , d 以及 A , A() , B , B() 真正代表什么吗?
如果可以的话,下面的东西就不用看了。
讲解的话用另一个例子吧,因为上述例子没有涉及到方法,不方便展开。
class A:
def __init__(self,name):
self.name = name
def say(self):
return("I am %s" % (self.name))
a1 = A
a2 = A("alex")
dir(a1)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'say']
dir(a2)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say']
在这个例子中, a1 和A是一个类,self 代表一个对象, a2与 A("alex") 代表一个实例, say() 代表方法。
可以看到 a1 这个类本身是不含 name 属性的,但有方法属性(这里必须补充一点,如果有类属性“xx”,
那么 a1 的属性列表里是会有“xx”的); a2 是一个实例,则有 name 属性; self 是一个对象,
因为不好测量,所以很多人模糊地认为对象就是实例,其实正确说来,对象一个模板,
而实例就是这个模板的具体实现,详细地说, self 包含 name和 say() 的属性和方法,
而 a2 包含 name 为 alex 以及 say() 方法;方法的话就不用细说了,
这个大家一般不会混淆。
现在看第一个例子就会觉得豁然开朗了吧,除了一个 type(A) 为什么是 type ,
这个涉及到 metaclass ,后续再说,不是本节重点。