OOP: Python - повторные значения при вызове метода - PullRequest
0 голосов
/ 13 февраля 2020

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

class Object:

    things = []

    def __init__(self, table):

        self.table = table
        self.things.append(table)

        ( ... )

    def thingy(self):
        return self.db.execute(f"select date, p1, p2 from {self.table}")

    def all_things(self):
        self.things.extend(
            map(lambda t: Object(thing=t + '_thing').thingy(), Constants.THINGS))

        return self.things 

Теперь, как бы я назвал этот объект, потому что моя вещь управляется по списку из Constants.THINGS, IE: THINGS = ["table1", "table2" ... ], но для создания объекта для вызова метода all_things() - мне нужно установить вещь - даже если метод устанавливает вещь по вызову ...

Это кажется немного отсталым, поэтому буду признателен за то, что я неправильно понимаю, так как думаю, что мне нужно изменить конструктор / объект

a = Object(end_date="2020-01-05",
           start_date="2020-01-01",
           thing=WHAT_TO_PUT_HERE).all_things()

Если я добавлю что-нибудь к этому thing Я получу двойной вывод

Любая помощь приветствуется

  • ОБНОВЛЕНИЕ:

Желаемым выводом будет то, что thing() сработает, основываясь на вводе списка предоставляется Constants.THINGS, если мы введем: THINGS = ["table1", "table2"], мы ожидаем, что thingy() выполнится дважды с:

select date, p1, p2 from table1, select date, p1, p2 from table2

И это будет добавлено к things переменная класса, а затем, когда all_things() завершится, мы должны иметь содержимое двух операторов выбора в ist

Однако

Object.things

фактически будет иметь [WHAT_TO_PUT_HERE, table_1, table2]

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Итак, согласно вашему обновлению, это то, что, я думаю, вы пытаетесь сделать.

class Object:
    def __init__(self):
        # do some initialization
        pass

    def thingy(self, table):
        return self.db.execute(f"select date, p1, p2 from {table}")

    # call the method "thingy" on all Constants.THINGS
    def all_things(self):
        map(self.thingy, Constants.THINGS)

Тогда из-за пределов класса вы бы назвали это следующим образом.

my_instance = Object()
my_instance.all_things()

Я предполагаю, что у класса также будет некоторая настройка и разрыв вашего соединения с БД. Как и некоторые другие вещи, но это просто минималистичная попытка c привести пример того, как это должно работать.

0 голосов
/ 13 февраля 2020

Хорошо, поэтому вместо того, чтобы иметь переменную класса, о которой @ Axe319 сообщал мне, сбрасывается не каждый экземпляр, как self.table. Я изменил конструктор так, чтобы он имел:

class Object:
    def __init__(self, table):
        self.table = table
        self.things = list()

Затем, когда я вызываю конкретный метод вне класса:

all_things(), я могу просто передать None в таблицу как метод строит это для меня. то есть:

a = Object(thing=None).all_things()

Это может быть анти-паттерном - опять я новичок в OOP, но он создает что-то, что выглядит правильно.

PS Да, я согласен, вещи, вещи и прочее были плохим выбором переменных для этого вопроса ...

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...