2

所以可以说我有一堂课:

class SuperClass():
    def __init__(self, number):
       self._inputnumber = number
       self._initallist = []

然后我想构建此类的子类,这些子类具有可以将项目添加到初始化列表、从中读取项目或从中删除项目的方法。例如。

class SubClass(SuperClass):
     def __init__(self, number, current_line, new_line): 
        self._number = number
        self._thisline = current_line
        self._gohere = new_line
     def execute(self):
        (SuperClass._initallist).append(self._thisline + 1)

这是我正在尝试做的一个粗略的例子。我希望能够让我的初始列表可用于几个类,以便他们都可以按照上面所示的方式对其进行操作。但是,在我的情况下最终发生的事情是我得到一个 AttributeError 说我的 SuperClass 没有命名属性。

AttributeError: type object 'SuperClass' has no attribute '_initiallist'

关于如何做到这一点的任何提示?甚至有可能还是我必须做其他事情才能达到这个结果?

4

3 回答 3

2

_initallist是一个实例属性,你不能通过Super._initallist.

我想你想做的是下面。您需要SuperClassSubClass. 而且我认为,如果这是一个正确关系,则需要一个numberin SubClass

class SuperClass():
    def __init__(self, number):
       self._inputnumber = number
       self._initallist = []

class SubClass(SuperClass):
     def __init__(self, number, current_line, new_line):
        SuperClass.__init__(self, number) 
        self._thisline = current_line
        self._gohere = new_line
     def execute(self):
        self._initallist.append(self._thisline + 1)
于 2013-07-21T10:33:54.677 回答
1

做就是了self._initiallist.append(self._thisline + 1)

于 2013-07-21T10:29:49.973 回答
0

“我想构建此类的子类,这些子类具有可以将项目添加到初始化列表的方法,......”

您是说您希望子类继承实例属性 _initiallist并提供对其采取行动的方法吗?如果是这种情况,那么子类的每个实例都将具有一个_initiallist属性,但每个_initiallist类的每个实例都将是一个不同的列表。

在那种情况下,解决方案就像张阳宇描述的那样。


“我希望能够为几个班级提供我的初始清单,以便他们都可以按照上面所示的方式采取行动。”

根据标题,我可以将其解释为:我希望超类的某个实例_initiallist的属性可用于几个子类的实例,以便它们都可以作用于相同的确切列表。

如果_initiallist是类属性,您可以这样做,或者您可以在实例化子类__init__时将超类的实例作为参数传递,据我目前所知。

此外,这意味着您的示例中的两个类不具有关系,而是您的超类实际上是一个共享对象(AFAIK)。

如果您将其设为类属性,那么您将失去一些灵活性,因为超类的不同实例都将具有_initiallist指向相同确切列表的属性。如果您将其保留为实例属性并将超类的实例作为参数(作为共享对象)传递给子类,那么您仍然可以实现您想要做的事情并且仍然可以灵活地创建多个实例你的共享对象。

class SharedObject(object):

    def __init__(self, number):
        self._inputnumber = number
        self._initiallist = []


class Client(object):

    def __init__(self, obj, current_line, new_line):
        self._sharedobj = obj
        self._thisline = current_line
        self._gohere = new_line

    def execute(self):
        self._sharedobj._initiallist.append(self._thisline + 1)
于 2013-07-21T14:19:52.677 回答