请看下面的代码:

class Main:
    def __init__(self):
        # list to keep track of instances of Sub()
        self.sub_list = []
        # create instances of Sub()
        self.a = Sub()
        self.b = Sub()
        # append instances to sub_list
        self.sub_list.append(self.a)
        self.sub_list.append(self.b)


class Sub:
    # function to remove the instance from sub_list
    def remove_self(self):
        x.sub_list.remove(self)


x = Main()

# remove instances of Sub() from sub_list
x.a.remove_self()
x.b.remove_self()


我的目标是使对象具有一种方法,以从创建它们的不同类的列表中删除自身。

上面的代码可以做到这一点,但是我不喜欢这样,我必须直接使用x来调用该方法。

但是,我想解决的主要问题是,由于无法访问Sub,我无法弄清楚如何将类sub_list移动到单独的文件中。

有一个更好的方法吗?

旁注:我正在使用PyQt开发一个项目,其中Main是我的MainWindow,而Sub表示一些可以动态创建和关闭的UI元素。如果可能,我想将所有功能保留在这些元素中。

最佳答案

理想的解决方案是根本不使用sub_list。似乎没有必要,因为在您的示例中,每个Sub实例都为其指定了一个字段。话虽如此,如果您想将Sub移到另一个文件中,可以这样做:

sub.py

class Sub:
    def __init__(self, parent):
        self.parent = parent

    def remove_self(self):
        self.parent.sub_list.remove(self)


然后在您的main.py中:

from sub import Sub
class Main:
    def __init__(self):
        self.sub_list = []
        self.a = Sub(self)
        self.b = Sub(self)
        self.sub_list.append(self.a)
        self.sub_list.append(self.b)


然后,您可以执行以下操作:

x = Main()
x.a.remove_self()


要么

x.sub_list[0].remove_self()


或者,这是我推荐的方法,摆脱remove_self并向Main添加一个新功能,该功能负责删除Sub实例:

class Main:
    def __init__(self):
        self.sub_list = []
        self.a = Sub(self)
        self.b = Sub(self)
        self.sub_list.append(self.a)
        self.sub_list.append(self.b)

    def removeSub(self, index):
        self.sub_list.pop(index)

x = Main()
x.removeSub(0)

09-04 19:15
查看更多