简体   繁体   English

如何在 Python 中以编程方式调用类成员函数?

[英]How to programmatically call a class member function in Python?

how to programmatically call a class member function in Python?如何以编程方式在 Python 中调用类成员函数?

For instance I've got a class Model in peewee, with various method attributes such as .select() , .join() , .where() etc...例如,我在 peewee 中有一个类Model ,具有各种方法属性,例如.select().join().where()等...

Here's an example from the documentation.这是文档中的一个示例。

query = (User
         .select(User.username, fn.COUNT(Favorite.id).alias('count'))
         .join(Tweet, JOIN.LEFT_OUTER)  # Joins user -> tweet.
         .join(Favorite, JOIN.LEFT_OUTER)  # Joins tweet -> favorite.
         .group_by(User.username))

To join multiple table, I've to call several times the join method.要加入多个表,我必须多次调用 join 方法。 The problem is that I'd like to be able to call it n where n is an array of link, as my Models are programmatically defined, same for the links.问题是我希望能够将它称为n ,其中n是一个链接数组,因为我的模型是通过编程定义的,链接也是如此。

So it could be something like this:所以它可能是这样的:

query = (ModelA
         .select(*AllModels)
         .join(ModelB, JOIN.LEFT_OUTER, on=cond1)
         .join(ModelC, JOIN.LEFT_OUTER, on=cond2)
         .join(ModelD, JOIN.LEFT_OUTER, on=cond3)
         .join(ModelE, JOIN.LEFT_OUTER, on=cond4)

How can I apply programmatically the join calls using a loop or equivalent?如何使用循环或等效方法以编程方式应用join调用?

To generate the list of joins, I've a structure such as below要生成连接列表,我有一个如下所示的结构

schema = {
        "datasets": {
        "a74d411f-412b-42b3-aa31-a1f687e0257e": {
            "oid": "5e585118de2ecd919a50fd94",
            "fullpath": "/vob/CABC/CABC123/ad/a/ae.sas7bdat"
        },
        "067a21c5-e512-49d7-bd2c-40fbb56e6f30": {
            "oid": "5e585118de2ecd919a50fd94",
            "fullpath": "/vob/CABC/CABC123/ad/a/dm.sas7bdat"
        },
        "067a21c5-e512-49d7-bd2c-40fbb56e6f31": {
            "oid": "5e585118de2ecd919a50fd94",
            "fullpath": "/vob/CABC/CABC123/ad/a/zn.sas7bdat"
        }
        },   
        "links": [
            {
                "dataset_origin": "a74d411f-412b-42b3-aa31-a1f687e0257e",
                "column_origin": "SUBJID",
                "dataset_target":  "067a21c5-e512-49d7-bd2c-40fbb56e6f30",
                "column_target": "SUBJID",
                "join_type": "INNER"
            },
            {
                "dataset_origin": "a74d411f-412b-42b3-aa31-a1f687e0257e",
                "column_origin": "SUBJID",
                "dataset_target":  "067a21c5-e512-49d7-bd2c-40fbb56e6f31",
                "column_target": "SUBJID",
                "join_type": "INNER"
            }
        ]
    }

Here you can just do a fold using a regular loop eg在这里,您可以使用常规循环进行折叠,例如

query = ModelA.select(*AllModels)
for Model, cond in ...:
    query = query.join(Model, JOIN.LEFT_OUTER, on=cond)

That aside, methods are accessed like any other attribute, so you can getattr(obj, method_name)(method_params...)除此之外,方法的访问方式与任何其他属性一样,因此您可以getattr(obj, method_name)(method_params...)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM