【问题标题】:Initialise class without instantiate?初始化类而不实例化?
【发布时间】:2019-02-03 22:43:43
【问题描述】:

我正在尝试编写一个简单的类,该类填充一些列表,然后尝试检索该信息,例如:

class Foo(object):

    def __init__(self):
        self.src = []
        self.values = []

    def addItems(self, name, val):
        self.src.append(name)
        self.values.append(val)

    def getItem(self, item):
        for i, x in enumerate(self.src):
            if x == item:
                return self.src[i], self.values[i]

要使用这个类,我首先必须实例化它,Foo(),然后才开始添加和检索对象。

a = Foo()
a.addItems('A', '1')
a.addItems('B', '2')
a.src  # ['A', 'B']
a.values  # ['1', '2']
a.getItem('A')  # ('A', '1')

有什么方法可以添加元素而不必先初始化类?类似于Foo.addItems('A', '1')(这给出了TypeError: addItems() missing 1 required positional argument: 'val')。

我看到其他使用 @staticmethod 的相关帖子,但无法弄清楚如何在此示例中使其工作。

【问题讨论】:

  • 你试图不实例化一个类的实际目的是什么?
  • 这个类应该作为一个更大程序的一部分被多次使用,所以我想不必每次调用都实例化它是有利的,例如避免这些重复: x = Foo() ... y = Foo() ... z = Foo()
  • 如果您必须以类似的方式多次重复实例化类,您应该使用循环将它们实例化为 dict 或对象列表。
  • 我明白了,这可能是一种选择,但不是让主程序更复杂,而是想知道这是否可以在类级别本身更好地完成。而且我猜它每次都需要分配:x = list_holding_instantiated_class[0] ... y = list_holding_instantiated_class[1]。
  • 不,实例旨在完全满足您的需求。试图在不实际创建实例的情况下管理类的不同实例的属性值违背了类的目的。

标签: python python-3.x class methods


【解决方案1】:

不确定您的具体想法。我想你可能会得到接近你所描述的东西。需要两个步骤。

首先 - 创建模块,例如 foo_module,您可以在其中创建和实例化您的类:

class Foo:
    def __init__(self):
        self.src = []
        self.values = []
    def addItems(self, name, val):
        self.src.append(name)
        self.values.append(val)
    def getItem(self, item):
        for i, x in enumerate(self.src):
            if x == item:
                return self.src[i], self.values[i]

root_foo = Foo()
src = root_foo.src
values = root_foo.values

def addItems(*args):
    return root_foo.addItems(*args)

def getItem(*args):
    return root_foo.getItem(*args)

第二个 - 导入 foo_module 并使用它:

import foo_module as f_m

f_m.addItems('A', '1')
f_m.addItems('B', '2')
print(f_m.getItem('A'))
print(f_m.src)
print(f_m.values)

现在,只要您在所有脚本中访问 foo_module,就可以访问同一个 Foo 实例。顺便说一句,这就是 python logging 模块的工作原理(根记录器)。

【讨论】:

  • 太棒了,这和我要找的很接近。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多