2017-09-18 1 views
0

Während einer Vorlesung begannen wir heute mit Unterklassen in Python zu arbeiten. Als Beispiel wurden wir ein sehr grundlegendes soziales Netzwerk gegebenen Code ähneln, der wie folgt lautet:Python Subclass Attribut Fehler

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) 

Jedes Mal, wenn ich dies zu laufen versuchen, ich die folgende Meldung angezeigt:

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' 

Einfach ausgedrückt Ich habe keine Ahnung, warum ich auf diesen Fehler stoße, vor allem nachdem der Professor den gleichen Code ausgeführt hat. Fehle ich hier etwas, und wenn ja, könnte jemand darauf hinweisen?

+1

Sind Sie sicher, dass dieser Code korrekt ist? Jede Klasse sollte nur eine "__init" -Methode haben. Hier hat 'node' zwei und' socialNetwork' weder. – GLR

+1

Das ist keine * Unterklasse *, das ist eine * Nested-Klasse *, was hier nicht wirklich sinnvoll ist ... –

Antwort

0

Sie haben keine Unterklassen definiert. Vererbung geschieht, indem die übergeordnete Klasse in Python angegeben (n) in Klammern, zB:

class Node: 
    pass 

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

„Netzwerk“ und „Node“ nicht wirklich Sinn macht Subklassen zu sein, aber man sollte composed des andere sein .

Was Sie getan haben, ist eine Klasse socialNetwork mit einem Attribut, einer Klasse namens node zu definieren. Deshalb erhalten Sie eine AttributeError, weil es kein addPerson Attribut in socialNetwork gibt.

1

Ihre Klasse hat keine addPerson Methode, weil Ihre Klasse falsch gemeint ist. Es sollte wie folgt aussehen:

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) 

Einrückungen spielt eine Rolle in python. Hinweis, dass etwas falsch ist, könnte sein, dass Sie zwei __init__ Methoden auf dem gleichen Niveau haben.

0

Erstens, node ist keine Unterklasse von socialNetwork, aber eine Klasse innerhalb der letzteren geschachtelt. Zweitens hat socialNetwork tatsächlich kein Attribut addPerson, aber socialNetwork.node tut.