静态方法中的Python引用子类

Ros*_*les 5 python inheritance introspection

这很难解释,但我要做的是创建一个Base对象来基于其他对象.Base类处理共享任务,以便子类不需要继续实现它们.但是,我还需要一个静态/类方法来创建类的实例.例如,这是我的Base类:

class Base(object):
    def __init__(self, service, reference, vo=None):
        self.service = service
        self.reference = reference
        self.id = reference.getId()
        self.name = reference.getName()
        # do a database lookup here to get more information

    @staticmethod
    def get_objects(service, references, as_dict=False):
        """
        More efficient way to get multiple objects at once. Requires the service
        instance and a list or tuple of references.
        """
        vo_list = database.get_objects_from_references(references)
        items = list()
        for vo in vo_list:
            items.append(Base(service, vo.getRef(), vo))

        return items
Run Code Online (Sandbox Code Playgroud)

get_objects()方法将获取存储在数据库中的条目的ID号列表,然后获取所有这些对象并一次性从中创建对象,而不是为每个ID命中数据库.我遇到的问题是我必须在该方法中使用Base()来实例化该类.但是这会实例化Base类,而不是子类:

class Something(Base):
    def __init__(self, service, reference, vo=None):
        Base.__init__(self, service, reference, vo)
        do_extra_stuff()
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道我是否这样做:

Something.get_objects(service, references)
Run Code Online (Sandbox Code Playgroud)

那只是运行Base的init()方法,还是运行子类的init()方法(以及do_extra_stuff()方法)?

Luk*_*ský 13

您需要一个类方法,它将获取类对象作为其第一个参数,以便您可以构建该特定类的实例:

@classmethod
def get_objects(cls, service, references, as_dict=False):
    """
    More efficient way to get multiple objects at once. Requires the service
    instance and a list or tuple of references.
    """
    vo_list = database.get_objects_from_references(references)
    items = list()
    for vo in vo_list:
        items.append(cls(service, vo.getRef(), vo))

    return items
Run Code Online (Sandbox Code Playgroud)