Python静态方法中的引用子类
这段话要说的有点复杂,但简单来说,我想创建一个基础对象(Base object),让其他对象可以基于它来构建。这个基础类(Base class)负责处理一些共同的任务,这样子类(subclass)就不需要每次都去实现这些功能。不过,我还需要一个静态方法或者类方法,用来创建这些类的实例。举个例子,这是我的基础类:
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() 来实例化这个类。但这样做会实例化基础类,而不是子类:
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
你想要的是一个类方法,这个方法的第一个参数会是类对象,这样你就可以用它来创建这个特定类的实例:
@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