从另一个类中的函数创建一个类的实例

2024-10-01 07:27:30 发布

您现在位置:Python中文网/ 问答频道 /正文



我不知道如何从另一个类创建对象的实例

下面我给出了一个例子,其中我们有一个MainWindow类,它代表一个web浏览器。然后,还有另一个名为MainWindowTab的类

MainWindow是用一个名为“tab1”的选项卡初始化的,但我希望能够添加另一个选项卡并将其命名为“tab2”(然后添加“tab3”和“tab4”等),但正如您在下面看到的,我在命名它时遇到了问题

此外,如果选项卡对象的析构函数没有看上去那么简单,那么任何与之相关的提示都会很好

任何帮助都会很好,谢谢

代码

class MainWindow(object):

    def __init__(self):
        self.tab = MainWindowTab(0)
        self.tabList = [self.tab]

    def addTab(self, num):
        newName = "tab"+str(len(self.tabList)+1)
        # How to add a new Tab with this name? Below will simply name the new tab as literally 'newName'
        # self.newName = MainWindowTab(10)


class MainWindowTab(object):

    def __init__(self, num):
        self.posn = num

Tags: nameselfnewobjectinitdeftab命名
3条回答

您可能不想将每个选项卡分配给self上的新属性,只需使用您已经创建的列表并从那里访问它们即可。 另外,在Python3中,类定义中不再需要(object)

class MainWindow:
    def __init__(self):
        self.tablist = [MainWindowTab(0)]

    def add_tab(self):
        tab_num = len(self.tablist)
        self.tablist.append(MainWindowTab(tab_num)

现在每个选项卡都可以作为self.tablist[0]self.tablist[1]等访问

要销毁选项卡,您需要将它们从主列表中删除,并调用对象本身所需的任何析构函数方法。比如:

    def kill_tab(self, num):
        """Kill tab number 'num'"""
        try:
            tab = self.tablist.pop(num)
            tab.destroy()
        except IndexError:
            print(f"Tab {num} doesn't exist!")

您可以将tab实例变量设置为list,然后append多个对象

class MainWindow(object):
    
    def __init__(self, numberOfTabs):
        self.tab = [MainWindow() for _ in range(numberOfTabs)]
        self.tabList = [self.tab]

    def addTab(self, num):
        newName = "tab"+str(len(self.tabList)+1)
        # How to add a new Tab with this name? Below will simply name the new tab as literally 'newName'
        # self.newName = MainWindowTab(10)
        self.tab.append(MainWindowTab(num))


class MainWindowTab(object):

    def __init__(self, num):
        self.posn = num

最明显的方法是使用setattr:

def addTab(self, num):
    newName = "tab"+str(len(self.tabList)+1)
    setattr(self, newName, MainWindowTab(10))

但正如另一个答案中所述,序列数据的更好方法是使用列表

相关问题 更多 >