Tim said:
I am extending a parser and need to create many classes that are all
subclassed from the same object (defined in an external library). When my
module is loaded I need all the classes to be created with a particular
name but the behavior is all the same. Currently I have a bunch of lines
like this:
class Vspace(Base.Command): pass
class Boldpath(Base.Command): pass
There are a bunch of lines like that.
Is there a better way? Something like
newclasses = ['Vspace', 'Boldpath', ... ]
for name in newclasses:
tmp = type(name, (Base.Command,) {})
tmp.__name__ = name
Is there a more pythonic way?
What is your objection against that approach?
By the way, I don't think you need
I am not completely understanding the type function I guess. Here is an example from the interpreter:
In [1]: class MyClass(object):
...: pass
...:
In [2]: type('Vspace', (MyClass,), {})
Out[2]: __main__.Vspace
In [3]: x = Vspace()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
C:\Python27\Scripts\<ipython-input-3-a82f21420bf3> in <module>()
----> 1 x = Vspace()
NameError: name 'Vspace' is not defined
In [4]: Vspace = type('Vspace', (MyClass,), {})
In [5]: x = Vspace()
In [6]: type(x)
Out[6]: __main__.Vspace
I don't understand how to make `Vspace` usable for creating instances later (line 3) when I just call `type`; that is why I thought adding the `__name__` attribute would work. Hmm, now I know that doesn't work either:
In [8]: del Vspace
In [9]: m = type('Vspace', (MyClass,), {})
In [10]: m.__name__ = 'Vspace'
In [11]: x = Vspace()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
C:\Python27\Scripts\<ipython-input-11-a82f21420bf3> in <module>()
----> 1 x = Vspace()
NameError: name 'Vspace' is not defined
In [11]: m
Out[12]: __main__.Vspace
Maybe this is too much trouble just to save a few lines (~50) of code.
thanks,
--Tim