Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调用父级';没有硬编码参数的子类中的s类_Python_Oop - Fatal编程技术网

Python 调用父级';没有硬编码参数的子类中的s类

Python 调用父级';没有硬编码参数的子类中的s类,python,oop,Python,Oop,我是Python的新手,在一个工作项目中一直在与继承概念作斗争。基类将从一个配置文件中获取目录路径、表名等(我不打算这样做,因为这与下面的问题无关),并通过super()\uuuuuu\init\uuu将其传递给子类 基类还具有将数据帧导出到MS SQL Server的方法。问题是,我无法将pandas数据帧从子类传递到父类,只能传递硬编码的值。我之所以这样做是因为数据帧彼此之间有很大的不同(需要独特的数据操作),但它们都来自同一个地方,并且将被放置在同一个数据库中 因此,我几乎需要从父级运行S

我是Python的新手,在一个工作项目中一直在与继承概念作斗争。基类将从一个配置文件中获取目录路径、表名等(我不打算这样做,因为这与下面的问题无关),并通过super()\uuuuuu\init\uuu将其传递给子类

基类还具有将数据帧导出到MS SQL Server的方法。问题是,我无法将pandas数据帧从子类传递到父类,只能传递硬编码的值。我之所以这样做是因为数据帧彼此之间有很大的不同(需要独特的数据操作),但它们都来自同一个地方,并且将被放置在同一个数据库中

因此,我几乎需要从父级运行SQL_导出,并将子级中定义的数据帧作为输入。我尝试将SQLExport放在我的init中,但是我得到了

AttributeError:'函数'对象没有'to_sql'属性

我所拥有的:

from configparser import ConfigParser
import pandas as pd

config_object = ConfigParser()
config_object.read('config.ini')

class Parent:
    def __init__(self, report, df, date=today):
        self.report = report
        self.df = df
        self.name = config_object[self.report]['name']
        self.table_name = config_object[self.report]['table_name']
   
    def SQLExport(self):
        return self.df.to_sql(self.table_name, con="engine")

class Child(Parent):
    def __init__(self):
        super().__init__('REPORTNAME', self.load_dataframe)
        super().SQLexport(self)

    def load_dataframe(self):
        self.df = pd.read_json(self.name + ".json")

if __name__ == '__main__':
    x = Child()

谢谢

代码存在多个问题

  • super().SQLexport(self)
    函数名在客户端类中是错误的(它应该是
    self.SQLexport
    ),它不接受任何参数,因此self不需要传递

  • pd.read_json(self.name.+“.json”)
    -
    Child
    类没有属性
    name
    ,因此self.name将失败

  • self.load_dataframe函数正在传递给super.init方法,而不是子类中的dataframe和
    load_dataframe
    函数中的无返回语句(
    return df

以上问题已得到纠正,您可以尝试使用下面的代码在sqlite内存数据库中编写数据帧

from configparser import ConfigParser
import pandas as pd

from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:')

config_object = ConfigParser()
config_object.read('config.ini')


class Parent:
    def __init__(self, report, df):
        self.report = report
        self.df = df
        self.name = config_object[self.report]['name']
        self.table_name = config_object[self.report]['table_name']

    def SQLExport(self):
        print(self.table_name)
        return self.df.to_sql(self.table_name, con=engine)


class Child(Parent):
    def __init__(self):
        self.name="test_123"
        super().__init__('REPORTNAME', self.load_dataframe())
        super().SQLExport()

    def load_dataframe(self):
        self.df = pd.read_json(self.name + ".json")
        return self.df

    def read_data(self):
        print(engine.execute("SELECT * FROM sample_table").fetchall())


if __name__ == '__main__':
    x = Child()
    x.read_data()

谢谢@nalanagula,我假设
super()\uuuu init\uuuu
会自动生成
Child
继承
父项的属性。我没有意识到我必须在新类中重新分配变量。它将解决这个问题,以及我在另一节课上遇到的一个问题。干杯