【问题标题】:Python 3: Pass variable from one CLASS to anotherPython 3:将变量从一个类传递到另一个类
【发布时间】:2019-06-01 04:49:12
【问题描述】:

我这里有一个初学者问题。我有一个父类,其中包含对 SQLite DB 和 ConfigParser ini 文件的调用,我希望我的子类能够访问所有这些信息。

以下是我的代码,以及迄今为止我尝试过的内容,但均未成功。我理解实例化,但只有很少的例子,比如员工/薪水哈哈。

如果我将所有对 DB 和配置文件的调用复制到子类中,我的代码就可以工作,我知道这不是应该这样做的。你能帮帮我吗?

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 中的所有变量都应该可以从父类和子类中访问。

谢谢,

编辑:

有oe没有self。我仍然得到同样的错误

【问题讨论】:

  • 您肯定需要self. 来引用db_conn,因为您将它声明为成员变量。 rows = db_conn.execute(queryFiltre) 应该是 rows = self.db_conn.execute(queryFiltre)
  • 使用 .self 或没有我仍然得到同样的错误。
  • 你确定是同一个错误吗?你能复制完整的错误堆栈跟踪吗?它将有行号。
  • 此外,您永远不会调用您声明的setQueryFiltre 函数,因此不会执行任何代码。你有什么理由在构造函数中声明它而不是它自己的方法?像这样的嵌套函数是一种反模式。
  • def setQueryFiltre(args) 声明函数,然后调用setQueryFiltre(args) 执行它。

标签: python-3.x oop instantiation


【解决方案1】:

您在构造函数中声明了 2 个从未被调用的函数:setQueryFiltregetQueryFiltre。此外,您的测试调用其中一个,就好像它是一个类方法一样。它不是,它会失败,因为声明只在函数内部可见。你的意思可能是这样写的:

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 方法在 set 之前被调用,你仍然会遇到同样的崩溃。我还制作了一些其他的 cmets,你可能接下来会被咬。

【讨论】:

  • 我已经尝试过了,我得到“'SimpleGrid'对象没有属性'db_conn'”
  • Nvm,我以为底部是从顶部继承的。从您的问题中不清楚底部是您对顶部版本的实现。问题是您从未宣布过它。我会更新答案。
  • 谢谢。我已经更新了我的代码,抱歉,那部分被删掉了,因为我认为很明显,从上面的代码中删除的所有内容仍然存在于下面的代码中。我只添加了修改的内容。
  • 没有这两行必须在父类中执行。我已将 self 添加到路径中,它似乎已解决。现在是对 wxfont 和 queryfiltre 的调用似乎导致了这个错误:类型对象“SimpleGrid”没有属性“getQueryFiltre”
  • 移动 db init 会引发错误,因为 dbfile 是在之后定义的。我认为我的问题在于子类的实例化。
猜你喜欢
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
相关资源
最近更新 更多