初始化类而不实例化?

时间:2019-02-03 22:43:44

标签: python python-3.x class methods

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

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的相关文章,但在此示例中无法弄清楚如何使其工作。

1 个答案:

答案 0 :(得分: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,就可以访问相同的foo_module实例。顺便说一下,这就是python logging模块(root logger)的工作方式。