class ListNode:
def __init__(self, x):
self.val = x
self.next = None


a = ListNode
a.val = 1
print(ListNode.val) # 返回 1

class ListNode2:
val = 1
def __init__(self, x):
self.val = x
self.next = None

print(ListNode2.val) # 返回 1

b = ListNode(3) # 这是在实例化对象,调用 init 对 对象本身定制 val 的值
print(b.val) # 返回 3

print(id(ListNode)) # 1324811791128
print(id(a)) # 1324811791128
print(id(b)) # 1324843200864




调用类时,不加括号。那么这个变量a 或者 b 都将时类本身。 进而对他进行的任何操作都是对类本身进行操作。 也不会经过__init__。
对val进行操作的时候, 也就是给类 增加了一个属性。

而加上括号之后。那么变量b 就是类实例化出的对象。这是再调用val的时候。 根据类的查找原则, 对象会先到自己的命名空间中找,也就是__init__定制的内容中。
如果找到了val就返回。也就是 3 了。
如果__init__ 中没有定制val这个属性。那么就会去类中找,就会返回 1 了!

下面这个例子,更清楚的反映了。加括号就是调用__init__
class clsTest():
y = None
def __init__(self):
self.y = '你'

x = clsTest
print(x.y) # None

x = clsTest()
print(x.y) # 你
posted on 2019-01-16 10:30  rookiehbboy  阅读(1460)  评论(0编辑  收藏  举报