2017-09-18 151 views
0

在今天的讲座中,我们开始使用Python中的子类进行工作。作为一个例子,我们得到的代码类似于一个非常基本的社交网络,这是如下:Python子类属性错误

class socialNetwork: 
    class node: 
     def __init__(self, name, friendList): 
      self.name=name 
      self.friendList=friendList 

     def __init__(self): 
      self.nodeList=[] 

     def addPerson(self, name, friendList): 
      person=self.node(name,friendList) 
      self.nodeList.append(person) 

s = socialNetwork() 
s.addPerson("John",["Alice","Bob"]) 
s.addPerson("Alice",["John","Bob","Jeff"]) 
s.addPerson("Bob",["John","Alice","Jeff","Ken"]) 
s.addPerson("Jeff",["Alice","Bob","Barbra"]) 
s.addPerson("Ken",["Bob","Barbra"]) 
s.addPerson("Barbra",["Jeff","Ken"]) 
for person in s.nodeList: 
    print("name: ",person.name, "\n\t friends: ",person.friendList) 

但是,每当我试图运行它,我收到以下消息:

Traceback (most recent call last): 
** IDLE Internal Exception: 
    File "C:\Users\Mike\AppData\Local\Programs\Python\Python36- 
32\lib\idlelib\run.py", line 460, in runcode 
    exec(code, self.locals) 
    File "C:/Users/Mike/AppData/Local/Programs/Python/Python36-32/run.py", 
line 15, in <module> 
    s.addPerson("John",["Alice","Bob"]) 
AttributeError: 'socialNetwork' object has no attribute 'addPerson' 

简而言之,我不知道为什么我遇到这个错误,特别是在教授运行相同的代码之后。我在这里错过了什么,如果有的话可以请人指出吗?

+1

你确定这段代码是正确的吗?每个类应该只有一个'__init'方法。这里'node'有两个,'socialNetwork'也没有。 – GLR

+1

这不是一个*子类*,它是一个*嵌套类*,在这里没有什么意义。 –

回答

0

您还没有定义任何的子类。继承是在Python通过将父类(ES)括号内指定,如:

class Node: 
    pass 

class Leaf(Node): 
    # Leaf is a subclass of Node 
    pass 

“网络”和“节点”不真正意义是子类,而应该是其他的composed

你所做的是定义一个具有一个属性socialNetwork的类,该类名为node。这就是为什么你得到一个AttributeError,因为socialNetwork中没有addPerson属性。因为你的类的目的是错误的方式

1

你的类没有addPerson方法。它应该看起来像这样:

class socialNetwork: 
    class node: 
     def __init__(self, name, friendList): 
      self.name=name 
      self.friendList=friendList 

    def __init__(self): 
     self.nodeList=[] 

    def addPerson(self, name, friendList): 
     person=self.node(name,friendList) 
     self.nodeList.append(person) 

缩进在python有重要意义。线索有什么不对的地方可能是你有两个相同级别的__init__方法。

0

首先,node不是socialNetwork的子类,而是嵌套在后者中的类。 其次,socialNetwork其实有没有属性addPerson,但socialNetwork.node一样。