2017-09-18 182 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一樣。