Ссылочный подкласс Python в статическом методе - PullRequest
5 голосов
/ 24 апреля 2011

Это будет сложно объяснить, но я пытаюсь создать объект Base, на котором будут основаны другие объекты.Базовый класс обрабатывает общие задачи, поэтому подклассам не нужно их реализовывать.Однако мне также нужен метод static / class, который создает экземпляры классов.Например, это мой базовый класс:

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

Метод get_objects () возьмет список номеров ID записей, хранящихся в базе данных, затем получит все эти объекты и сделает из них объекты водин выстрел вместо попадания в базу данных для каждого идентификатора.Проблема у меня заключается в том, что я должен использовать Base () в этом методе для создания экземпляра класса.Но это создает экземпляр базового класса, а не подкласса:

class Something(Base):
    def __init__(self, service, reference, vo=None):
        Base.__init__(self, service, reference, vo)
        do_extra_stuff()

Моя проблема в том, что я не знаю, делаю ли я это:

Something.get_objects(service, references)

Будет ли это просто запускать базовый Метод init (), или он будет запускать метод подкласса init () (и метод do_extra_stuff ())?

1 Ответ

13 голосов
/ 24 апреля 2011

Вместо этого вам нужен метод класса , который получит объект класса в качестве первого параметра, чтобы вы могли создать экземпляр этого конкретного класса:

@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
...