这不像“键”功能坏了.它列出了类中的所有内容和引用的类。我做错什么了。我越是尝试蟒蛇,我就越相信它是由无能的人设计的.在php中同样的事情是2分钟的事情。*-/
class Nodes:
nodes = {}
def nd_add(self,nId):
self.nodes[nId]= Node(nId)
def nd_print(self):
for node in self.nodes.keys():
# print node
self.nodes[node].nd_print()
def keys(self):
return self.nodes.keys()
class Node:
childs = Nodes()
ddid = False
def __init__(self,nid):
self.ddid = nid
def nd_print(self):
print self.ddid
print self.childs.keys()
# self.nodes.nd_print()
root = Nodes()
root.nd_add("bob")
root.nd_add("dub")
root.nodes["bob"].childs.nd_add("sponge")
print "root"
root.nd_print()这就是最后的结果:
root
sponge
['sponge', 'bob', 'dub']
bob
['sponge', 'bob', 'dub']
dub
['sponge', 'bob', 'dub']py版本为2.7
发布于 2019-12-17 12:23:20
您将实例变量与类变量混淆。
在类定义中包含变量定义,就像上面所做的那样,引入了类变量,这意味着变量不属于单个对象,而只存在于类中一次。
考虑一下这个例子:
class MyClass:
a = [5]
def __init__(self):
self.b = [10]
ins1 = MyClass()
ins2 = MyClass()
print("ins1", ins1.a, ins1.b)
print("ins2", ins2.a, ins2.b)
ins1.a.append(6)
ins1.b.append(11)
print("ins1", ins1.a, ins1.b)
print("ins2", ins2.a, ins2.b) 产出:
ins1 [5] [10]
ins2 [5] [10]
ins1 [5, 6] [10, 11]
ins2 [5, 6] [10] 注意两种情况下a是如何改变的,而b只对ins1进行了更改。您还可以执行类似print(MyClass.a)的操作,因为a属于MyClass,而不是print(MyClass.b),因为类本身没有属性b,只有它的实例才有。这并不是因为Python是由无能的程序员设计的,而是因为所有东西都是Python中的一个对象,包括类。(type(MyClass)返回class)因此,类本身可以具有与其实例的属性不同的属性!实例可以使用.attribute语法访问这些变量,但它仍然只是对类变量的引用。
官方教程的9.3.5节解释了这一点,并给出了与示例完全相同的错误,以及类变量的用例。
注意:如果您是python的新手,您可能应该坚持使用python 3,因为不再支持2。不过,差别很小。
发布于 2019-12-17 14:41:10
https://stackoverflow.com/questions/59373737
复制相似问题