【问题标题】:Python Subclass Attribute ErrorPython子类属性错误
【发布时间】:2018-02-27 06:57:09
【问题描述】:

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

简单地说,我不知道为什么会遇到这个错误,尤其是在教授运行相同的代码之后。我是否在这里遗漏了什么,如果有,请有人指出?

【问题讨论】:

  • 你确定这段代码是正确的吗?每个类应该只有一个__init 方法。这里node 有两个,socialNetwork 没有。
  • 这不是一个子类,而是一个嵌套类,这在这里没有任何意义......

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


【解决方案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__ 方法。

【讨论】:

    【解决方案2】:

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

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

    “Network”和“Node”作为子类并没有什么意义,但其中一个应该是另一个的composed

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-17
        • 1970-01-01
        • 2021-12-23
        • 2014-03-21
        • 2013-07-01
        • 2011-10-12
        • 1970-01-01
        • 2016-04-19
        相关资源
        最近更新 更多