how to find out if an object is a class?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • szczepiq

    how to find out if an object is a class?

    Pardon me for most likely a dummy question but how do I find out if an
    object is a class?

    I need something like that:

    def foo(self, obj):
    if (obj is a class):
    some stuff
  • Wojtek Walczak

    #2
    Re: how to find out if an object is a class?

    Dnia Thu, 7 Aug 2008 14:36:37 -0700 (PDT), szczepiq napisa³(a):
    Pardon me for most likely a dummy question but how do I find out if an
    object is a class?

    Use types.ClassType :
    >>class Q:
    .... pass
    ....
    >>import types
    >>isinstance( Q, types.ClassType )
    >>True
    --
    Regards,
    Wojtek Walczak,

    Comment

    • Terry Reedy

      #3
      Re: how to find out if an object is a class?



      Wojtek Walczak wrote:
      Dnia Thu, 7 Aug 2008 14:36:37 -0700 (PDT), szczepiq napisa�(a):
      >Pardon me for most likely a dummy question but how do I find out if an
      >object is a class?
      >
      >
      Use types.ClassType :
      >
      >>>class Q:
      ... pass
      ...
      >>>import types
      >>>isinstance(Q , types.ClassType )
      >>>True
      That is only true and only works for 2.x old-style classes and not for
      2.x new-style classes and all 3.0 classes, for which isinstance(Q,ty pe)
      is True.
      >>class old: pass
      ....
      >>type(old)
      <type 'classobj'>
      >>class new(object): pass
      ....
      >>type(new)
      <type 'type'>

      Comment

      • Carl Banks

        #4
        Re: how to find out if an object is a class?

        On Aug 7, 8:56 pm, Terry Reedy <tjre...@udel.e duwrote:
        Wojtek Walczak wrote:
        Dnia Thu, 7 Aug 2008 14:36:37 -0700 (PDT), szczepiq napisa (a):
        Pardon me for most likely a dummy question but how do I find out if an
        object is a class?
        >
        Use types.ClassType :
        >
        >>class Q:
        ...    pass
        ...
        >>import types
        >>isinstance( Q, types.ClassType )
        >>True
        >
        That is only true and only works for 2.x old-style classes and not for
        2.x new-style classes and all 3.0 classes, for which isinstance(Q,ty pe)
        is True.
        isinstance(Q,ty pe) is also true for built in types and C extension
        types, which may or may not be what the OP wants.

        The most accurate way I can think of to check for a class defined in
        Python is to test the type's tp_flags field for Py_TPFLAGS_HEAP TYPE
        bit, but I don't know of any simple way to check for it from Python.
        It's still possible for it to fail since someone could create heap
        types in C though I'd expect that's very rare.


        Carl Banks

        Comment

        • Terry Reedy

          #5
          Re: how to find out if an object is a class?



          Carl Banks wrote:
          On Aug 7, 8:56 pm, Terry Reedy <tjre...@udel.e duwrote:
          >That is only true and only works for 2.x old-style classes and not for
          >2.x new-style classes and all 3.0 classes, for which isinstance(Q,ty pe)
          >is True.
          >
          isinstance(Q,ty pe) is also true for built in types and C extension
          types
          That is rather the point of new and improved classes -- that the
          implementation language of a class be pretty much irrelevant from the
          user api viewpoint ;-)

          Comment

          • Miles

            #6
            Re: how to find out if an object is a class?

            On Fri, Aug 8, 2008 at 2:31 AM, Stefan Behnel wrote:
            I recently had the reverse case that a (stupidly implemented) extension module
            required a callback function and I wanted to pass a function wrapped in a
            wrapper object. That failed, because it specifically checked for the argument
            being a function, not just a callable object. I had to pull quite a number of
            tricks to reimplement the wrapper class as a function (thank god, it's Python!).
            You really only needed one trick:

            def functionize(cal lable):
            return lambda *args, **kwargs: callable(*args, **kwargs)

            :)

            -Miles

            Comment

            • Christian Heimes

              #7
              Re: how to find out if an object is a class?

              szczepiq wrote:
              Pardon me for most likely a dummy question but how do I find out if an
              object is a class?
              For God's sake don't reinvent the wheel! The 'inspect' module (part of
              the Python standard library) has a functions isclass(). It does the
              proper tests for new style and old style classes.

              import inspect
              inspect.isclass (something)

              Christian

              Comment

              • Stefan Behnel

                #8
                Re: how to find out if an object is a class?

                Miles wrote:
                On Fri, Aug 8, 2008 at 2:31 AM, Stefan Behnel wrote:
                >I recently had the reverse case that a (stupidly implemented) extension module
                >required a callback function and I wanted to pass a function wrapped in a
                >wrapper object. That failed, because it specifically checked for the argument
                >being a function, not just a callable object. I had to pull quite a number of
                >tricks to reimplement the wrapper class as a function (thank god, it's Python!).
                >
                You really only needed one trick:
                >
                def functionize(cal lable):
                return lambda *args, **kwargs: callable(*args, **kwargs)
                Congratulations , you found the trivial case.

                Stefan

                Comment

                • Steven D'Aprano

                  #9
                  Re: how to find out if an object is a class?

                  On Fri, 08 Aug 2008 16:38:14 +0200, Stefan Behnel wrote:
                  Miles wrote:
                  >On Fri, Aug 8, 2008 at 2:31 AM, Stefan Behnel wrote:
                  >>I recently had the reverse case that a (stupidly implemented)
                  >>extension module required a callback function and I wanted to pass a
                  >>function wrapped in a wrapper object. That failed, because it
                  >>specificall y checked for the argument being a function, not just a
                  >>callable object. I had to pull quite a number of tricks to reimplement
                  >>the wrapper class as a function (thank god, it's Python!).
                  >>
                  >You really only needed one trick:
                  >>
                  >def functionize(cal lable):
                  > return lambda *args, **kwargs: callable(*args, **kwargs)
                  >
                  Congratulations , you found the trivial case.
                  What other cases are there? It takes any callable, and returns a function
                  that calls the callable. What else do you need? This is not a rhetorical
                  question.

                  The above works as expected for classes and methods:
                  >>x = functionize(flo at)
                  >>type(x)
                  <type 'function'>
                  >>x('123')
                  123.0
                  >>L = [1,2,3]
                  >>y = functionize(L.a ppend)
                  >>y(44)
                  >>L
                  [1, 2, 3, 44]

                  It even works for recursive functions:
                  >>def fact(n):
                  .... if n <= 1: return 1
                  .... else: return n*fact(n-1)
                  ....
                  >>z = functionize(fac t)
                  >>z(5)
                  120


                  I haven't tested it on classmethods, staticmethods, or instances with a
                  __call__ method, but I see no reason why it wouldn't work with them. What
                  am I missing?



                  --
                  Steven

                  Comment

                  • Stefan Behnel

                    #10
                    Re: how to find out if an object is a class?

                    Steven D'Aprano wrote:
                    On Fri, 08 Aug 2008 16:38:14 +0200, Stefan Behnel wrote:
                    >Miles wrote:
                    >>On Fri, Aug 8, 2008 at 2:31 AM, Stefan Behnel wrote:
                    >>>I recently had the reverse case that a (stupidly implemented)
                    >>>extension module required a callback function and I wanted to pass a
                    >>>function wrapped in a wrapper object. That failed, because it
                    >>>specifical ly checked for the argument being a function, not just a
                    >>>callable object. I had to pull quite a number of tricks to reimplement
                    >>>the wrapper class as a function (thank god, it's Python!).
                    >>You really only needed one trick:
                    >>>
                    >>def functionize(cal lable):
                    >> return lambda *args, **kwargs: callable(*args, **kwargs)
                    >Congratulation s, you found the trivial case.
                    >
                    What other cases are there? It takes any callable, and returns a function
                    that calls the callable. What else do you need? [...] What am I missing?
                    The words "stupidly implemented" above? :)

                    I have to set the callback in more than one place and (believe it or not) the
                    library behaves (slightly) different when you pass different callbacks. The
                    right way to use the above approach would be to wrap the callback right before
                    passing it into the library - which I can't do, as that would give me a
                    different function object each time. Also, most of the time I actually pass a
                    function, except in one case where I need a wrapper for an existing function.
                    So the solution I chose was to change the original wrapper class itself
                    instead of re-wrapping it, so that I get the expected object right away.

                    As usual, it's all about the details.

                    Stefan

                    Comment

                    Working...