1
nkliwenjian 2013-04-11 11:02:33 +08:00
稍微有一点吧。C1的a是定义在类上面的,你可以直接C1.a来取到,C2则只能先实例化一个对象才能取到
|
2
huangzxx 2013-04-11 12:37:37 +08:00
补充楼上的 :)
>>> import test >>> c1 = test.C1 >>> c1 <class 'test.C1'> >>> c1.a 1 >>> c2 = test.C2 >>> c2 <class 'test.C2'> >>> c2.a Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: type object 'C2' has no attribute 'a' >>> c2 = test.C2() >>> c2 <test.C2 object at 0x7f5f8fee1350> >>> c2.a 1 >>> |
3
013231 2013-04-11 12:46:13 +08:00
第一個例子中, a是類的變量; 第二個例子中, a是實例的變量.
print C1.a 1 print C2.a AttributeError: type object 'C2' has no attribute 'a' |
4
sphinxdwood 2013-04-11 13:48:54 +08:00
3楼正解。
|
5
hit9 2013-04-11 22:41:25 +08:00
类也是对象,对象就有属性。前者中a就是类的属性,后者a是这个 类的一个实例的属性。 访问的顺序是: 如果实例没有a,python会去看看它的类有没有a这个属性。
|
6
windviki 2013-04-12 16:57:59 +08:00
简单的类实例计数:
>>> class A: >>> a = 0 >>> def __init__(self): >>> A.a += 1 >>> print A.a >>> _a = A() 1 >>> _a.a 1 >>> _b = A() 2 >>> A.a 2 >>> _a.a 2 类级别的变量可以理解为类静态变量,它的值被所有实例共享。一个实例更改了它,另外实例读取的时候就是更改后的值。 类的成员变量是每个实例独自维护。 |
7
glancesx 2013-04-13 14:21:14 +08:00
前者类属性,后者数据属性.
|
8
hexor 2013-04-14 12:00:03 +08:00
诶 这不是挺简单的事儿吗 我来说清楚好了
前者的a 是所有对象甚至是没有对象的时候 都可以调用和修改的 直接通过 C1.a 就可以进行调用和修改 后者的a 是每个对象自己的东西 比如说你新建了两个C2类的对象 o1 o2 那么 o1.a 与 o2.a 由这两个对象o1 o2分别维护. class C1(object): a = 1 class C2(object): def __init__(self): self.a = 1 |