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