【问题标题】:How can I get the type of a class without instantiating it in Python?如何在不使用 Python 实例化的情况下获取类的类型?
【发布时间】:2016-12-04 02:00:27
【问题描述】:

给定一个对象很容易在python中获取对象类型:

obj = SomeClass()
t = type(obj)

如果不先创建类的实例,我该如何做到这一点?

背景:一旦你有了类型,你就可以轻松地创建该类型的实例。使用这种机制,我想将一个类型传递给一个对象,该对象稍后将创建该类型的实例。不必先创建一个会立即被丢弃的对象是非常合理的。

【问题讨论】:

  • t = SomeClass
  • 对象的类型与创建它的类相同。因此,SomeClass 对象的类型为SomeClass。在 Python 2 中,来自旧样式类的对象的类型为 instance,但在 Python 3 中并非如此。

标签: python python-3.x oop


【解决方案1】:

这个答案适用于任何来到此页面的人想知道“我如何检查一个类的类型而不用 Python 实例化它?”

如果您正在使用包含类而不是对象的变量,您可以使用issubclass() 内置函数检查它是否是某个类。

基于上一个答案:

>>> class MyClass(object):
...     pass
...
>>> c = MyClass
>>> type(c)
<class 'type'>
>>> issubclass(c, MyClass)
True

【讨论】:

    【解决方案2】:

    查看此示例代码:

    class MyClass(object):
        pass
    
    if __name__ == '__main__':
        o1 = MyClass()
        c = MyClass
        o2 = c()
    
        print(type(o1), type(o2), MyClass)
    

    定义一个类会将它绑定到它的名称(这里:MyClass),它只不过是对该定义的引用。在此示例中,发出c = MyClass 只是将类引用镜像到另一个变量,变量cMyClass 现在的内容完全相同。因此,您可以通过调用其中任何一个(即MyClass()c())来实例化该类的对象,从而产生相同的效果。

    此外,测试实例化对象的类型会产生完全相同的类引用。你甚至可以更进一步:

    o3 = type(o1)()
    

    这会创建 o1 所在类的新实例。

    【讨论】:

    • 感谢您详细解释!
    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 2020-10-17
    • 2012-05-23
    • 2019-12-18
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多