Metaclass' __init__ Does not Initialize
Stephan Diehl
stephan.diehl at gmx.net
Wed Nov 12 05:10:47 EST 2003
The __init__ runs just fine.
You just did a tiny little programming error
The line that says
"k = 'something'"
must be replaced by
"setattr(self,k,'something')"
Stephan
achan wrote:
> As I was trying to create a metaclass, I found out that __init__ defined
> in it does not initializes at all:
>
> class CMeta(type):
> def __new__(cls, ClassName, BaseClass, ClassDict):
> def __init__(self):
> for k in self.__slots__:
> k = 'something'
> NewDict = {'__slots__': [], '__init__': __init__}
> for k in ClassDict:
> if k.startswith('__') and k.endswith('__'):
> if k in NewDict:
> warnings.warn("Can't set attr %r in bunch-class %r" %
> (k, ClassName))
> else:
> NewDict[k] = ClassDict[k]
> else:
> NewDict['__slots__'].append(k)
> return type.__new__(cls, ClassName, BaseClass, NewDict)
>
> class CNewType(object):
> __metaclass__ = CMeta
> a = 'nothing'
> b = 'nothing'
> c = 'nothing'
>
>
>
>>>> x = CNewType()
> something
> something
> something
>>>> x.a
> Traceback (most recent call last):
> File "<interactive input>", line 1, in ?
> AttributeError: a ------------->>> Non-existent!
>
>
>
>
>
>
> class CMeta(type):
> def __new__(klass, name, base, dict):
> def __init__(self):
> for s in seq:
> s = 123
> print s
> newDict = {'__init__': __init__, seq = []}
> return type.__new__(klass, name, base, newDict)
>
> class Test(object):
> __metaclass__: CMeta
>
>
>>>> a = Test()
>>>>
More information about the Python-list
mailing list