如何从列表中动态生成类?

2024-03-28 22:27:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个类,自动为将来可以访问的值添加一个holder,这样当我运行cd.orders或cd.users时,它将返回或给我刚才查询的每个表的数据帧

以下是我的示例代码:

class samplecode:
    def __init__(self,credentials):
        c = credentials ('DATABASE', 'USER', 'PASSWORD', 'HOST', 'PORT', 'SCHEMA')
        print('credentials loaded')
        self.connection_string = "postgresql://%s:%s@%s:%s/%s" % (c.USER,
                                                                  c.PASSWORD,
                                                                  c.HOST,
                                                                  str(c.PORT),
                                                                  c.DATABASE)
        self.engine = sa.create_engine(connection_string)
        print('redshift connected')
        self.data = []

    def get_db(self,tables):
        for t in tables:
            self.data = pd.read_sql_query('SELECT * FROM database.{} limit 10'.format(t),engine)
            print(self.data.head(2))

cd = samplecode(credential)
# llf.view_obj
cd.get_db(['orders','user'])

我希望在cd.get\u db之后它会返回或者给我两个实例/对象。当我键入dir(cd)时

我应该能够做cd.orders和cd.user,如果我添加更多的列表cd.xyz

我尝试了这个,但只能访问最近的df,因为它覆盖了另一个df

class Wrapper(object):
    def __init__(self, data):
        self.data = data
    def __getattr__(self, attr):
        return [d[attr] for d in self.data]

# Wrapper([{'x': 23}, {'x': 42}, {'x': 5}]) 
instancelist = ['orders','user']

for i in instancelist:
    data = Wrapper([{i:'a'}])
cd.data

希望得到帮助和澄清,谢谢

或者,如果这令人困惑,请考虑以下几点:

class BaseClass:
    def __init__(self):
        self.a = []
        self.b = []

    def execute_query(self,table_name):
        for tables in table_name:
            self.table_name = run_query()

table_list = ['D','E','F']
test = BaseClass
test.execute_query(table_list)

dir(test)
[
 'a',
 'b',
 'D',
 'E',
 'F'
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
]

Tags: inselffordatagetinitdeftable
1条回答
网友
1楼 · 发布于 2024-03-28 22:27:46

听起来你在找setattr内置的。可以调用它将属性(以字符串形式给出)分配给对象。因此,您可以将每个表指定给以表名命名的属性,而不是打印出表:

def get_db(self,tables):
    for t in tables:
        data = pd.read_sql_query('SELECT * FROM database.{} limit 10'.format(t), engine))
        setattr(self, t, data)

您还可以在另一个方向上执行操作,并让属性的查找触发数据库查询。为此,您需要向类中添加一个__getattr__方法。当一个属性在正常情况下被查找而没有找到时,就会调用它

def __getattr__(self, name):
    data = pd.read_sql_query('SELECT * FROM database.{} limit 10'.format(name), engine))
    setattr(self, name, data)  # save to an attribute so we don't need to query it again
    return data

相关问题 更多 >