The subclass __module__ is installed in the metaclass module when manually creating a new class with type ()

In the following example, a newly created subclass becomes a metaclass __module__, not a module of the parent classes. I only saw this when used ABCMetaso that it could be something specific for this module, does anyone know what could happen?

In [1]: from abc import ABCMeta

In [2]: class test(metaclass=ABCMeta):
   ...:     pass
   ...: 

In [3]: newclass = type('newclass', (test,), {})

In [4]: newclass.__module__
Out[4]: 'abc'

The behavior that I want occurs when I define a subclass in a more standard way:

In [5]: class subtest(test):
   ...:     pass
   ...: 

In [6]: subtest.__module__
Out[6]: '__main__'

Can someone explain why this is so and how you could, using type, create a new subclass with the correct inherited attribute __module__(e.g. __module__=='__main__')?

+4
source share
1 answer

, type.__new__, __module__, type.__new__ __module__ , type.__new__, __name__ Python.

newclass = type('newclass', (test,), {}), type abc.ABCMeta, type.__new__ abc, type , __module__ abc.

class subtest(test):
    pass

- __module__ = __name__, __name__ abc.__name__.

__module__ , type, __module__ :

newclass = type('newclass', (test,), {'__module__': __name__})

# or

newclass = type('newclass', (test,), {})
newclass.__module__ = __name__
+5

Source: https://habr.com/ru/post/1695258/


All Articles