Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python实例类中使用keys函数_Python_Class_Dictionary_Key - Fatal编程技术网

如何在python实例类中使用keys函数

如何在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

这不起作用,看起来“键”功能坏了。。。它列出了类和引用类中的所有内容。我做错了什么。。。我越是尝试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():
  #    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分钟内完成了这项工作:-/没有问题。