views:

45

answers:

3

Some code.

In [1]: A = type('B', (), {})

In [2]: a = A()

In [3]: b = B()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)

/home/shabda/<ipython console> in <module>()

NameError: name 'B' is not defined

What does first argument to type doing here?

A: 

It's creating a new class with the name B:

Python 2.5.4 (r254:67916, Nov 19 2009, 22:14:20)
[GCC 4.3.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> type('B', (), {})
<class '__main__.B'>

See the second form of type here for more information.

When you assign the result of calling type to a variable, you're just giving the class B another name. It's equivalent to doing

>>> class B(object):
...     pass
...
>>> A = B
>>> a = A()
>>> b = B()
Zach Hirsch
+2  A: 

It's setting the __name__ property of the created class.

When you say:

class B(object):

two things happen with that 'B':

  • The name 'B' is assigned the class. This is just like if you'd said "B = ...".

  • The __name__ property of the class is set to 'B'.

When you invoke the type constructor manually only the latter half is done. If you don't assign the result to 'B' then B will remain set (or unset) as it was before.

Note that a similar result could be obtained by saying:

class B(object):
    pass
A = B
del B

Now A refers to a class that calls itself 'B', and B doesn't refer to anything.

Laurence Gonsalves
A: 

'B' is just a string which is the name of A One place it is used is for the default __repr__ of classes and their objects

>>> A=type('B', (), {})
>>> A
<class '__main__.B'>
>>> a=A()
>>> a
<__main__.B object at 0xb7cf88ec>

The usual way to create a class has no way to explicitly set the __name__ attribute. In this case it is implicitly set by the class constructor

>>> class A:pass
... 
>>> A
<class __main__.A at 0xb7cf280c>

But there is nothing stopping you from changing the name afterward

>>> A.__name__
'A'
>>> A.__name__='B'
>>> A
<class __main__.B at 0xb7cf280c>
>>>
gnibbler