Python 3: передать переменную из одного КЛАССА в другой - PullRequest
0 голосов
/ 01 июня 2019

У меня здесь проблема новичка. У меня есть родительский класс, который содержит вызов базы данных SQLite и INI-файла ConfigParser, и я хочу, чтобы мой дочерний класс получил доступ ко всем этим частям информации.

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

Мой код работает, если я копирую все вызовы в БД и файлы конфигурации в дочерний класс, и я знаю, что это не так. Не могли бы вы помочь мне?

class SimpleGrid(gridlib.Grid): ##, mixins.GridAutoEditMixin):
    def __init__(self, parent, log):
        gridlib.Grid.__init__(self, parent, -1)

        self.wxFont = "9, wx.FONTFAMILY_DEFAULT, wx.NORMAL, wx.NORMAL"

        path =os.path.dirname(os.path.realpath(__file__))
        configFile = os.path.join(path , "config.ini")

        dbfile = os.path.join(path , "report.db")
        self.db_conn = sqlite3.connect(dbfile)
        self.theCursor =  self.db_conn.cursor()

        config = configparser.ConfigParser()
        config.read(configFile)


        if config.get('Network', 'taboola') == "true" and config.get('Network', 'outbrain') == "true":
            network = ""
        elif config.get('Network', 'taboola') == "true" and config.get('Network', 'outbrain') == "false":
            network = " and CAMPAIGN LIKE '%TB%'"
        elif config.get('Network', 'outbrain') == "true" and config.get('Network', 'taboola') == "false":
            network = " and CAMPAIGN LIKE '%OB%'"
        else:
            network = ""

        if config.get('Sort', 'value') == "Impr.":
            sort = "IMPR" 
        elif config.get('Sort', 'value') == "Clicks":
            sort = "CLICKS"
        elif config.get('Sort', 'value') == "CTR":
            sort = "CTR"  
        elif config.get('Sort', 'value') == "CPC":
            sort = "CPC"  
        elif config.get('Sort', 'value') == "eCPC":
            sort = "eCPC"
        elif config.get('Sort', 'value') == "Spent":
            sort = "SPENT"
        elif config.get('Sort', 'value') == "Revenue":
            sort = "GA_REV" 
        elif config.get('Sort', 'value') == "GA Impr.":
            sort = "GA_IMPR"  
        elif config.get('Sort', 'value') == "GA Clicks":
            sort = "GA_CLICKS"
        elif config.get('Sort', 'value') == "GA CTR":
            sort = "GA_CTR"
        elif config.get('Sort', 'value') == "Rev. /1000":
            sort = "GA_RPM"
        else:
            sort = "SPENT"

        #['Impr.', 'Clicks', 'CTR', 'CPC', 'eCPC', 'Spent', 'Revenue', 'GA Impr.', 'GA Clicks', 'GA CTR', 'Rev. /1000'] 

        if config.get('Filter', 'column') == "Campaign":
            column = "CAMPAIGN"
        elif config.get('Filter', 'column') == "Impr.":
            column = "IMPR"
        elif config.get('Filter', 'column') == "Clicks":
            column = "CLICKS"
        elif config.get('Filter', 'column') == "CTR":
            column = "CTR" 
        elif config.get('Filter', 'column') == "CPC":
            column = "CPC"  
        elif config.get('Filter', 'column') == "eCPC":
            column = "eCPC"    
        elif config.get('Filter', 'column') == "Spent":
            column = "SPENT"
        elif config.get('Filter', 'column') == "Revenue":
            column = "GA_REV" 
        elif config.get('Filter', 'column') == "GA Impr.":
            column = "GA_IMPR"
        elif config.get('Filter', 'column') == "GA Clicks":
            column = "GA_CLICKS"
        elif config.get('Filter', 'column') == "GA CTR":
            column = "GA_CTR"        
        elif config.get('Filter', 'column') == "Rev. /1000":
            column = "GA_RPM"
        else:
            column = ""

        if config.get('Filter', 'operator') == "Contains":
            query = "and " + column + " LIKE '%" + config.get('Filter', 'string') + "%'"
        elif config.get('Filter', 'operator') == "Doesn't Contain":
            query = "and " + column + " NOT LIKE '%" + config.get('Filter', 'string') + "%'"


        if config.get('Filter', 'operator') == "<":
            query = "and " + column + " < " + config.get('Filter', 'string')
        elif config.get('Filter', 'operator') == ">":
            query = "and " + column + " > " + config.get('Filter', 'string')

        #To instantiate
        queryFiltre = "SELECT * FROM Report WHERE  GA_RPM > 0 " + query + network + "  and STATUS = '1' ORDER BY " + sort + " DESC"
        print(queryFiltre) 

        rows = self.db_conn.execute(queryFiltre)
        rowsCount = len(rows.fetchall())

class TestFrame(wx.Frame):
    def __init__(self, parent, log):
        wx.Frame.__init__(self, parent, 0, "V1.0", size=(1400,800))
        self.grid = SimpleGrid(self, log)

Что я сделал до сих пор:

class SimpleGrid(gridlib.Grid): ##, mixins.GridAutoEditMixin):
    def __init__(self, parent, log):
        gridlib.Grid.__init__(self, parent, -1)


        self.wxFont = "9, wx.FONTFAMILY_DEFAULT, wx.NORMAL, wx.NORMAL"
        self.queryFiltre = ""

        def setQueryFiltre(queryFiltre):
            path =os.path.dirname(os.path.realpath(__file__))
            configFile = os.path.join(path , "config.ini")
            dbfile = os.path.join(path , "report.db")
            self.db_conn = sqlite3.connect(dbfile)
            self.theCursor =  self.db_conn.cursor()

            config = configparser.ConfigParser()
            config.read(configFile)

            #All the calls to DB and config file here

            return queryFiltre

        def getQueryFiltre(queryFiltre):
            queryFiltre = queryFiltre

        rows = db_conn.execute(queryFiltre)
        rowsCount = len(rows.fetchall())


class TestFrame(wx.Frame):
    def __init__(self, parent, log):
        wx.Frame.__init__(self, parent, 0, "V1.0", size=(1400,800))
        self.grid = SimpleGrid(self, log)

        self.wxFont = SimpleGrid(self.wxFont)
        self.queryFiltre = SimpleGrid.getQueryFiltre()

Но здесь первая ошибка, которую я получаю, это то, что db_conn не определена, и я уверен, что у меня все еще будет больше информации, если этот автомобиль будет взят. На самом деле все переменные внутри def setQueryFiltre должны быть доступны как в родительском, так и в дочернем классах.

Спасибо,

EDIT:

С эй без себя. я все еще получаю ту же ошибку enter image description here

1 Ответ

1 голос
/ 01 июня 2019

Вы объявили 2 функции внутри вашего конструктора, которые никогда не будут вызываться: setQueryFiltre и getQueryFiltre. Более того, ваш тест вызывает один из них, как если бы это был метод класса. Это не так, и произойдет сбой, потому что объявление видно только внутри функции. Что вы, вероятно, хотели написать, это:

class SimpleGrid(gridlib.Grid): ##, mixins.GridAutoEditMixin):
    def __init__(self, parent, log):
        gridlib.Grid.__init__(self, parent, -1)
        self.setQueryFiltre(None)

        self.wxFont = "9, wx.FONTFAMILY_DEFAULT, wx.NORMAL, wx.NORMAL"
        self.queryFiltre = ""

    def setQueryFiltre(self, queryFiltre):
        path = os.path.dirname(os.path.realpath(__file__))
        configFile = os.path.join(path , "config.ini")
        dbfile = os.path.join(path , "report.db")
        self.db_conn = sqlite3.connect(dbfile)
        self.theCursor =  self.db_conn.cursor()

        config = configparser.ConfigParser()
        config.read(configFile)

        #All the calls to DB and config file here
        return queryFiltre # why are you returning the argument? For chaining?

    def getQueryFiltre(self, queryFiltre):
        queryFiltre = queryFiltre

        rows = self.db_conn.execute(queryFiltre)
        rowsCount = len(rows.fetchall())
        # you probably want to return rows here?


class TestFrame(wx.Frame):
    def __init__(self, parent, log):
        wx.Frame.__init__(self, parent, 0, "V1.0", size=(1400,800))
        self.grid = SimpleGrid(self, log)

        # self.wxFont = SimpleGrid(self.wxFont) # what does this try to do?
        self.queryFiltre = self.grid.getQueryFiltre()

В Python важен отступ.

Обратите внимание, что я также перенес инициализацию db в конструктор, где он принадлежит. Потому что в противном случае, если метод get будет вызван до установки, у вас все равно будет такой же сбой. Я также сделал пару других комментариев, которые вы, вероятно, будете кусать следующим.

...