Python-if/else与dict映射?

Python-if/else与dict映射?,python,if-statement,dictionary,Python,If Statement,Dictionary,我有一个从其中一个对象返回引用值的方法。在调用方法之前,我不知道将从哪个类对象返回。不同的类引用属性是不同的,但用于相同的目的 看起来是这样的: def _get_ref_object(self): """"Return reference object: invoice or expense""" self.line_ids.ensure_one() line = self.line_ids[0] invoice = line.move_line_id.inv

我有一个从其中一个对象返回引用值的方法。在调用方法之前,我不知道将从哪个类对象返回。不同的类引用属性是不同的,但用于相同的目的

看起来是这样的:

def _get_ref_object(self):
    """"Return reference object: invoice or expense"""
    self.line_ids.ensure_one() 
    line = self.line_ids[0]
    invoice = line.move_line_id.invoice
    if invoice:
        return invoice
    else:  # If there is no invoice, it means it is expense
        return line.expense_id
现在,当我有了精确的对象时,我可以从各种属性返回各种参考值。 例如,如果我需要参考发票或费用编号,对于发票,我需要返回
编号
属性的值,对于费用,我需要返回
名称
属性的值

但要使其正常工作,我需要再次调用if/else以了解返回的对象,如:

def get_reference(self, ref):
    obj = self._get_ref_object()
    if ref == 'number':
        if obj._name = 'account.invoice':
            return obj.number
        else:
            return obj.name
现在,如果我想获取其他属性的引用,我需要执行相同的if/else检查。但我开始思考,也许可以使用字典来映射所有这些,然后使用
ref
作为键访问属性?就性能而言,只访问字典的值而不是执行if/else是否更快?在这种情况下,这是否是一种良好的做法

更新使用dict映射实现:

_ref_map = {
    'account.invoice': {'ref': 'number'},
    'hr.expense.expense': {'ref': 'name'}
}

def get_reference(self, ref):
    obj = self._get_ref_object()
    attr = _ref_map[obj._name][ref]
    return getattr(obj, attr)

我可以想象字典查找比if/else结构要快“稍微”到“很多”,但我不确定这是否是您应该做的。为什么不对当前类型进行子类化,以创建知道它们是什么的
发票
费用
对象呢?性能方面,这并不重要,这里的情况是让代码清楚地表达意图,并且在这样做的过程中,可以进行维护。除非您已经将此特定函数确定为瓶颈,否则这比性能更重要,尤其是对于这样一个微不足道的情况。为了提供一个有用的答案,最好有更多的背景。例如,你可以考虑使用
策略
模式,或者只是简单的继承。@AdamSmith你是说我当前类型的子类是什么意思?我需要的是一些通用的方法,可以在不知道从哪个对象获得引用的情况下获得引用。@Andrius我想我不理解您的用例。该方法绝对知道调用它的对象是什么。既然没有,我就假设“拥有”这个方法的类型并不像它应该的那样具体。如果你能把整节课都贴出来,我可能会提出一个更具体的建议。你用字典解决问题的方法会怎么样?如果检查的话,我看不出它怎么能从
中恢复过来。