【问题标题】:Python Reference Subclass in a Static Method静态方法中的 Python 引用子类
【发布时间】:2011-08-11 15:47:59
【问题描述】:

这将很难解释,但我想做的是创建一个 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

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()

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

Something.get_objects(service, references)

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

【问题讨论】:

    标签: python inheritance introspection


    【解决方案1】:

    您想要一个 class method 代替,它将获取类对象作为其第一个参数,以便您可以构建该特定类的实例:

    @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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      相关资源
      最近更新 更多