【问题标题】:How to get another class based upon type of object?如何根据对象类型获取另一个类?
【发布时间】:2019-08-12 10:58:29
【问题描述】:

我有一个用例,我想根据对象类型获取另一个类。

对于一个解决方案,我创建了一个 dict,我在其中维护这种关系并使用类型在类之间进行匹配。

例如,考虑下面的代码

class classA(object):
    def __init__(self):
        print "A called"

class classB(object):
    def __init__(self):
        print "B called"

MAP = {
   A: classA,
   B: classB
}

class C(object):
    pass

class A(C):
    pass

class B(C):
    pass

obj can be object of A or B.

new_cls = MAP.get(type(obj), 'None')
new_obj = new_cls()

有没有更好的方法来实现这一点?

【问题讨论】:

    标签: python


    【解决方案1】:

    为什么不这样做:

    class C(object):
        pass
    
    class A(C):
        def call:
            print("A")
    
    class B(C):
        def call:
            print("B")
    obj.call()
    

    或者使用继承。

    但是等等,如果我不能这样做并且真的需要知道这是哪个类??

    你可以使用这个obj.__class__.__name__ 这将适用于旧风格和new style Classes

    【讨论】:

    • 调用只是一个例子,我可能还想获得一些其他的类参考
    • @DeepanshuArora 您需要在原始问题中展示更详细的示例,以便可以更完整地回答。
    • @lurker 编辑了示例。现在有意义吗?
    【解决方案2】:

    看起来您正在尝试重塑 type-based polymorphic dispatch...

    我假设您没有使用 AB 类(=> 它们属于 stdlib 或您不想分叉的第三方),否则非常明显的解决方案就是直接在这些类上实现call(或任何其他方法)。

    在这种情况下,您的解决方案实际上是相当 Python 的。另一个可能的pythonic解决方案是using functools.singledispatch,最后的手段邪恶丑陋但有时是救生员的解决方案是monkeypatchAB

    【讨论】:

    • 你能检查我编辑的问题吗,如果我需要不同的类类型来创建对象而不是方法,这是否也适用
    • @DeepanshuArora python 有一个“可调用对象”的概念(docs.python.org/3/library/functions.html#callable)。函数是可调用的,方法是可调用的,类是可调用的(这就是您实例化它们的方式),并且您可以定义自己的可调用对象。我的回答适用于所有可调用对象。
    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 2022-08-09
    • 2016-04-28
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2010-10-14
    • 2021-03-18
    相关资源
    最近更新 更多