Python子类属性错误

时间:2017-09-18 16:42:21

标签: python python-3.x subclass computer-science subclassing

在今天的演讲中,我们开始在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'

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

3 个答案:

答案 0 :(得分: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__方法。

答案 1 :(得分:0)

您还没有定义任何子类。通过将父类放在括号中来在Python中指定继承,例如:

class Node:
    pass

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

&#34;网络&#34;和&#34; Node&#34;作为子类真的没有意义,但是另一个应该是composed

您所做的是定义一个具有一个属性的类socialNetwork,一个名为node的类。这就是您获得AttributeError的原因,因为addPerson中没有socialNetwork属性。

答案 2 :(得分:0)

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