Lachlan Gunn a écrit : > Hello. > > I have a library (SQLObject) that stores data as class variables. I would > like to set a class variable in a certain context, specific to a certain > instance of an object. This would require some sort of anonymous class. I > have attempted to use the following code to set the connection string: > > | class SQLStorage:
You probably want: class SQLStorage(object): > | def __init__(self, c, debug = False): > | config = StorageConfiguration(c) > | > | connection = sqlobject.connectionForURI(config.databaseString) > | if debug: > | connection.debug = True > | > | # I don't know whether this is right. My belief is that we can > | # subclass each table and use _connection on them. > | class newDatum(DatumTable): > | _connection = connection > | > | class newMetadatum(MetadatumTable): > | _connection = connection > | > | class newChecksum(ChecksumTable): > | _connection = connection > | > | self.__SQLDatum = newDatum > | self.__SQLMetadatum = newMetadatum > | self.__SQLChecksum = newChecksum Are you sure you need name mangling here ? > This does not work; Python complains that the classes already exist when > SQLObject is instantiated for a second time. This has led me to try > instantiating a subclass using DatumTable.__class__ and friends, but this > requires setting a class name, which, again, limits me to a single > instance. I *could* have a counter that appends a number to each class > name, but that's a fairly ugly solution; is it possible to create an > anonymous class in Python? Yes. Using type() : Help on class type in module __builtin__: class type(object) | type(object) -> the object's type | type(name, bases, dict) -> a new type >>> class Toto(object): ... pass ... >>> class Tutu(object): ... def __init__(self, what): ... self._toto = type('Autototo', (Toto,), dict(_what=what)) ... >>> t = Tutu(42) >>> t._toto <class '__main__.Autototo'> >>> t._toto._what 42 >>> t._toto() <__main__.Autototo object at 0xb7c3806c> >>> t2 = Tutu(1138) >>> t2._toto <class '__main__.Autototo'> >>> t2._toto._what 1138 -- http://mail.python.org/mailman/listinfo/python-list