首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python实例类中使用key函数?

如何在python实例类中使用key函数?
EN

Stack Overflow用户
提问于 2019-12-17 11:53:52
回答 2查看 38关注 0票数 0

这不像“键”功能坏了.它列出了类中的所有内容和引用的类。我做错什么了。我越是尝试蟒蛇,我就越相信它是由无能的人设计的.在php中同样的事情是2分钟的事情。*-/

代码语言:javascript
复制
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()

这就是最后的结果:

代码语言:javascript
复制
root
sponge
['sponge', 'bob', 'dub']
bob
['sponge', 'bob', 'dub']
dub
['sponge', 'bob', 'dub']

py版本为2.7

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-17 12:23:20

您将实例变量与类变量混淆。

在类定义中包含变量定义,就像上面所做的那样,引入了类变量,这意味着变量不属于单个对象,而只存在于类中一次。

考虑一下这个例子:

代码语言:javascript
复制
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) 

产出:

代码语言:javascript
复制
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。不过,差别很小。

票数 0
EN

Stack Overflow用户

发布于 2019-12-17 14:41:10

  • 从其他答案中,实例变量和类变量应该是明确的。
  • 我做了一些代码修改。您可以使用它作为参考。 类节点: def __init__(self):self.nodes = {} #实例变量def nd_add(self,nId):self.nodesnId= Node(nId) def nd_print(self,parent=None):对于self.nodes.keys()中的节点:# print节点self.nodesnode.nd_print(父) def键(Self):返回self.nodes.keys()类节点: ddid = False def __init__(self,nid):self.ddid = nid self.childs = None #实例变量def nd_print(self,parent=None):如果父节点为None: print '%s是父节点:'%self.ddid else: print '%s是%s'%(self.ddid,父节点)的子节点(如果self.childs不是None: self.childs.nd_print(self.ddid) def nd_add_child(self,( root.nodes'bob'.childs.nodes'sponge'.nd_add_child('xxx') ):self.childs =self.childs() self.childs.nd_add(child_id) root =节点() root.nd_add("bob") root.nd_add("dub") root.nd_add(“dub”)root.nodes“bob”(“海绵”).nd_add_child#这需要一个正确的函数打印"root“root.nd_print()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59373737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档