【问题标题】:Python check instances of classesPython 检查类的实例
【发布时间】:2013-01-11 01:06:13
【问题描述】:

有什么方法可以检查对象是否是类的实例?不是具体类的实例,而是任何类的实例。

我可以检查一个对象不是类、不是模块、不是回溯等,但我对一个简单的解决方案感兴趣。

【问题讨论】:

  • 每个 python 对象都是某个类的实例(内置或其他)。
  • 所以解决方法是函数 def isobject(x): return True
  • 如果我写from my_module import MyClass 将是类对象,而不是类的实例,类似于回溯、函数、模块。 inspect 模块包含针对此类对象的特殊检查功能,但没有针对类实例的功能。粗略地说,我想检测所有对象,print obj 将为其打印 <instance of ...>(如果没有为类定义特殊打印)
  • 一个类只是另一个类的一个实例(当区分很重要时称为元类;通常是type,但任何人都可以定义一个元类,IIRC,即使没有从type继承)。回溯只是traceback 的一个实例。函数只是function 的一个实例。方法也只是类的一个实例(这取决于您所说的方法的确切含义)。您必须更具体——甚至更好,只需tell us your actual problem

标签: python object instance


【解决方案1】:

你试过isinstance()内置函数吗?

您还可以查看hasattr(obj, '__class__') 以查看该对象是否是从某个类类型实例化的。

【讨论】:

  • 这个函数检查具体类的实例,据我所知。我必须将一些类传递给这个函数,例如isinstance(obj,FooBar) 我写不出像isinstance(obj)这样的东西
  • @exbluesbreaker isinstance(obj, object) 或我们层次结构中的其他一些合适的类呢?正如其他人所说的那样,Python 中的所有内容都是某个类的实例,包括数字、回溯、异常等。
  • 到目前为止,hasattr(obj, '__class__') 对于我尝试过的所有类型的变量都是正确的。也许__name__ 会更好检查。
【解决方案2】:

很难说出你想要什么,但也许inspect.isclass(val) 就是你要找的?

【讨论】:

  • 据我所知,这一项检查,如果 val 是类对象(不是类的实例),例如在from MyModule import MyClassa = MyClass() inspect.isclass(MyClass) 之后返回True,但inspect.isclass(a) 返回False
【解决方案3】:

isinstance() 是你的朋友。它返回一个布尔值,可以通过以下方式检查类型。

if isinstance(obj, (int, long, float, complex)):
    print obj, "is a built-in number type"

if isinstance(obj, MyClass):
    print obj, "is of type MyClass"

希望这会有所帮助。

【讨论】:

  • 你必须列出所有内置类型并检查它是否没有,他说他不想要
  • 这也检查对象是否继承自一个类。例如。 isinstance(MyClass_instance, object) == true.
  • 看起来 isinstance(MyClass, type) 返回 True 而 isinstance(MyClass(), type) 返回 False。 isinstance(MyClass, object)isinstance(MyClass(), object) 都返回 True。带类型的 Isinstance 似乎是唯一可行的方法
【解决方案4】:
class test(object): pass
type(test)

返回

<type 'type'>

instance = test()
type(instance)

返回

<class '__main__.test'>

所以这是区分它们的一种方法。

def is_instance(obj):
    import inspect, types
    if not hasattr(obj, '__dict__'):
        return False
    if inspect.isroutine(obj): 
        return False
    if type(obj) == types.TypeType: # alternatively inspect.isclass(obj)
        # class type
        return False
    else:
        return True

【讨论】:

    【解决方案5】:

    我迟到了。无论如何认为这应该可行。

    is_class = hasattr(obj, '__name__')
    

    【讨论】:

    • 不幸的是它没有。我有 Python 2.7.6,我定义的类的实例没有__name__,但函数有。
    【解决方案6】:

    import inspect
    inspect.isclass(myclass)
    

    【讨论】:

      【解决方案7】:

      这是一个肮脏的把戏。

      if str(type(this_object)) == "<type 'instance'>":
          print "yes it is"
      else:
          print "no it isn't"
      

      【讨论】:

      • 类,如class MyClass(object) 等从“对象”派生的类不返回"&lt;type 'instance'&gt;",而是返回"&lt;class 'MyClass'&gt;",因此您必须将s.startswith("&lt;class ") 添加到条件中。
      【解决方案8】:

      最近不得不处理类似的事情。

      import inspect
      
      class A:
          pass
      
      def func():
          pass
      
      instance_a = A()
      
      def is_object(obj):
           return inspect.isclass(type(obj)) and not type(obj) == type
      
      is_object(A)          # False
      is_object(func)       # False
      is_object(instance_a) # True
      

      【讨论】:

      • 在我的 Python (2.7.12) 中,inspect.isclass(type(a)) 无论如何都会返回 true,这也是你的函数 is_object
      • @Youda008,你是对的。这段代码有缺陷。棘手的问题。
      【解决方案9】:

      我遇到了类似的问题,结果证明对我有用:

      def isclass(obj):
          return isinstance(obj, type)
      

      【讨论】:

      • 这不适用于非内置 type afaict
      【解决方案10】:

      如果您想检查用户定义类的对象而不是具体内置类型的实例,您可以检查它是否具有__dict__ 属性。

      >>> class A:
      ...     pass
      ... 
      >>> obj = A()
      >>> hasattr(obj, '__dict__')
      True
      >>> hasattr((1,2), '__dict__')
      False
      >>> hasattr(['a', 'b', 1], '__dict__')
      False
      >>> hasattr({'a':1, 'b':2}, '__dict__')
      False
      >>> hasattr({'a', 'b'}, '__dict__')
      False
      >>> hasattr(2, '__dict__')
      False
      >>> hasattr('hello', '__dict__')
      False
      >>> hasattr(2.5, '__dict__')
      False
      >>> 
      

      如果您有兴趣检查一个实例是否是任何类的对象,无论是用户定义的还是具体的,您可以简单地检查它是否是object 的实例,它是python 中的最终基类。

      class A:
          pass
      a = A()
      isinstance(a, object)
      True
      isinstance(4, object)
      True
      isinstance("hello", object)
      True
      isinstance((1,), object)
      True
      

      【讨论】:

        【解决方案11】:

        是的。因此,您可以使用hasattr(obj, '__dict__')obj is not callable(obj)

        【讨论】:

          【解决方案12】:

          有什么方法可以检查对象是否是类的实例?不是一个 具体类的实例,但任何类的实例。

          我可以检查一个对象不是一个类,不是一个模块,不是一个 追溯等,但我对一个简单的解决方案感兴趣。

          一种方法,就像您在问题中描述的那样,是一个排除过程,检查它是否不是您想要的。我们检查它是类、模块、回溯、异常还是函数。如果是,那么它不是类实例。否则,我们会返回 True,这在某些情况下可能很有用,而且我们会在此过程中建立一个小助手库。

          这里有一些代码定义了一组类型检查器,然后将它们全部组合起来以排除我们不关心这个问题的各种东西。

          from types import (
              BuiltinFunctionType,
              BuiltinMethodType,
              FunctionType,
              MethodType,
              LambdaType,
              ModuleType,
              TracebackType,
          )
          from functools import partial
          from toolz import curry
          import inspect
              
          def isfunction(variable: any) -> bool:
              return isinstance(
                  variable,
                  (
                      BuiltinFunctionType,
                      BuiltinMethodType,
                      FunctionType,
                      MethodType,
                      LambdaType,
                      partial,
                      curry
                  ),
              )
              
          isclass = inspect.isclass
              
          def ismodule(variable: any) -> bool:
             return isinstance(variable, ModuleType)
              
              
          def isexception(variable: any) -> bool:
              return isinstance(variable, Exception)
              
              
          def istraceback(variable: any) -> bool:
              return isinstance(variable, TracebackType)
              
              
          def isclassinstance(x: any) -> bool:
              if isfunction(x) or isclass(x) or ismodule(x) or istraceback(x) or isexception(x):
                  return False
              return True
          

          请记住,从抽象的角度来看,一切都是事物,甚至是事物或功能的类别......但从实际的角度来看,这有助于避免将 MyClass 误认为 my_class_instance(python 社区也非正式地这样做PascalCase 与蛇形案例)

          我们可以改进一下

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-15
            • 1970-01-01
            • 2022-12-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多