Инициализировать класс без создания экземпляра? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь работать с простым классом, который заполняет некоторые списки, а затем пытается извлечь эту информацию обратно, что-то вроде:

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 голосов
/ 04 февраля 2019

Не уверен, что именно ты имеешь в виду.Я думаю, вы можете получить что-то близкое к тому, что вы описали.Необходимо выполнить два шага.

Первый - создать модуль, скажем, 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).

...