代码之家  ›  专栏  ›  技术社区  ›  Mathieu

创建与变量类型相同的对象

  •  1
  • Mathieu  · 技术社区  · 6 年前

    让我们定义几个 Event 班级:

    class Event1:
        def __init__(self, id, val1, val2):
            self.id = id
            self.val1 = val1
            self.val2 = val2
    
    class Event2:
        def __init__(self, id):
            self.id = id
    
    class Event3:
        def __init__(self, id, val1):
            self.id = id
            self.val1 = val1
    

    我使用存储事件的队列( heapq ). 为了避免使用多个if/else语句,我将语句压缩为 or . 结果是:

    event = heapq.heappop(heap)
    if type(event) == Event1 or type(event) == Event2:
        # Do stuff
    
    else:
        # Do stuff
    

    我的问题是,在退出语句之前,我想重新安排一个与我的变量相同类型的新事件。 event .

    i、 e.在if语句中:

    if type(event) == Event1 or type(event) == Event2:
        new_event = # Same type as event, either Event1 or Event2
        # Both take the same arguments, 
        # so I do not need to bother with *arg and **kwargs.
    

    如何创建与变量类型相同的实例?谢谢!

    3 回复  |  直到 6 年前
        1
  •  2
  •   deceze    6 年前
    if isinstance(event, (Event1, Event2)):
        new_event = type(event)()
    

    你得到一个实例的类 type(event) ,然后使用 () . 你应该使用 isinstance 而不是比较类。不仅可以 isinstance公司 同时与多个类相比,它还支持进一步的继承,即如果您曾经这样做过 class Event4(Event1): pass .

        2
  •  2
  •   Cory Kramer    6 年前

    您可以获取对象的类型,然后初始化另一个对象

    if type(event) == Event1 or type(event) == Event2:
        new_event = type(event)(some_id)
    

    顺便说一下,我通常更喜欢 isinstance

    if isinstance(event, (Event1, Event2)):
        new_event = type(event)(some_id)
    
        3
  •  1
  •   U13-Forward    6 年前
    if type(event) in (Event1,Event2):
        new_event = type(event)(something)
    

    更容易检查天气 type(event) Event1 Event2