【问题标题】:Creating an instance of a class from a function in another class从另一个类中的函数创建一个类的实例
【发布时间】:2020-10-23 13:55:05
【问题描述】:


我无法弄清楚如何从另一个类创建对象的实例

下面我给出了一个例子,我们有一个 MainWindow 类,它代表例如网络浏览器。然后,还有另一个类叫做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

【问题讨论】:

  • IDK 如果这可以 100% 确定,但我相信您可以在添加选项卡功能中添加以下内容:self.tabList.append(MainWindowTab(num))
  • 我有点困惑。你到底想做什么?看来你应该只创建一个MainWindowTab 的新实例并将其添加到self.tabList,不是吗?

标签: python python-3.x class oop object


【解决方案1】:

您可以将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

【讨论】:

  • 感谢您的回复!啊,我明白了,所以列表确实包含对象,并且每个对象都可以有自己的属性。这应该可以,感谢您的帮助!
  • 不客气@WhoDatBoy。现在,如果您觉得有帮助,请接受我的回答,
【解决方案2】:

您可能不想将每个选项卡分配给self 上的新属性,只需使用您已经创建的列表并从那里访问它们。 此外,在 Python 3 中,类定义中不再需要 (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 对象被附加到列表中,因此每个对象都有自己的属性。我不知道我在第一次阅读时是怎么错过的。感谢您的帮助!
【解决方案3】:

最明显的方法是使用setattr:

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

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

【讨论】:

  • 感谢您的回复!但是,您的代码中没有任何地方实际实例化过一个新选项卡吗?你是不是忘了在 setattr() 之前添加那行?
  • 是的,我没有得到这部分问题
猜你喜欢
  • 2016-08-25
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多