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