如何在python实例类中使用keys函数
这不起作用,看起来“键”功能坏了。。。它列出了类和引用类中的所有内容。我做错了什么。。。我越是尝试python,我就越相信它是由不称职的人编写的。。。在php中,同样的事情需要2分钟的时间。:-/如何在python实例类中使用keys函数,python,class,dictionary,key,Python,Class,Dictionary,Key,这不起作用,看起来“键”功能坏了。。。它列出了类和引用类中的所有内容。我做错了什么。。。我越是尝试python,我就越相信它是由不称职的人编写的。。。在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(): # prin
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您将实例变量与类变量混淆了 在类定义中包含变量定义(如上所述)会引入类变量,这意味着该变量不属于单个对象,但对于该类只存在一次 考虑这个例子:
class-MyClass:
a=[5]
定义初始化(自):
self.b=[10]
ins1=MyClass()
ins2=MyClass()
打印(“ins1”、ins1.a、ins1.b)
打印(“ins2”、ins2.a、ins2.b)
ins1.a.append(6)
ins1.b.1(11)
打印(“ins1”、ins1.a、ins1.b)
打印(“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,因为不再支持python 2。不过差别很小。- 从其他答案来看,实例变量和类变量应该是明确的
- 我做了一些代码修改。你可以把它作为参考
class Nodes: def __init__(self): self.nodes = {} # instance variable def nd_add(self,nId): self.nodes[nId]= Node(nId) def nd_print(self, parent=None): for node in self.nodes.keys(): # print node self.nodes[node].nd_print(parent) def keys(self): return self.nodes.keys() class Node: ddid = False def __init__(self,nid): self.ddid = nid self.childs = None # instance variable def nd_print(self, parent=None): if parent is None: print '%s is a parent Node: '%self.ddid else: print '%s is a child node of %s'%(self.ddid, parent) if self.childs is not None: self.childs.nd_print(self.ddid) def nd_add_child(self, child_id): self.childs = Nodes() self.childs.nd_add(child_id) root = Nodes() root.nd_add("bob") root.nd_add("dub") root.nodes["bob"].nd_add_child("sponge") root.nodes['bob'].childs.nodes['sponge'].nd_add_child('xxx') # this needs a proper function print "root" root.nd_print()
\uuuu init\uuuu
)并在其中初始化'nodes','childs'和'ddid'。哼,这太奇怪了!我想这就是他们所说的蟒蛇的意思。。。我看得越多,就越觉得它是某个地方一个疯孩子写的…:-/没有其他语言像这样。。。我的意思是pascal,BASIC,PHP,C++,java(+脚本)等等。我想我每转一圈都得撞到我的头。。。我用php在大约15分钟内完成了这项工作:-/没有问题。