class ListNode: def __init__(self, x): self.val = x self.next = None a = ListNodea.val = 1print(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)) # 1324811791128print(id(a)) # 1324811791128print(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 = clsTestprint(x.y) # None x = clsTest()print(x.y) # 你
原文地址:https://www.cnblogs.com/chengege/p/10275648.html
时间: 2024-09-29 02:31:59