2017-09-18 26 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'メソッドを1つだけ持つ必要があります。ここでは 'node'には2つあり、' socialNetwork'にはありません。 – GLR

+1

これは*サブクラス*ではない*ネストされたクラス*であり、実際にここでは意味をなさない... –

答えて

0

サブクラスを定義していません。継承は、括弧内に親クラス(ES)を置くことによって、Pythonで指定されている例:

class Node: 
    pass 

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

「ネットワーク」と「ノード」は本当にサブクラスであることを意味がありませんが、一方が他方のcomposedする必要があります。

あなたがしたことは、nodeという名前のクラスを持つクラスsocialNetworkを定義することです。そのため、socialNetworkにはaddPersonという属性がないため、AttributeErrorが表示されます。

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に問題がありません。何かが間違っているということは、同じレベルに2つの__init__メソッドがある可能性があります。

0

まず、nodesocialNetworkのサブクラスではなく、後者の中にネストされたクラスです。 第2に、socialNetworkには実際には属性がありませんaddPersonですが、socialNetwork.nodeはありません。

関連する問題