Ошибка типа: __class__ должен быть установлен в класс - PullRequest
0 голосов
/ 08 января 2019

Версия Python: 2.7.8

Нажмите здесь, чтобы посмотреть: Структура каталогов


- Ошибка: -

TypeError: __class__ должен быть установлен в класс.

Эта ошибка возникает в строке 7 / строке 9 (в зависимости от переданной версии) в Web.py self .__ class__ = Gui_A .


-> Объект создан из Web.py <- </strong>


other_dir

class BaseParent():
    def test(self):
        pass

Dir / __ * INIT 1039 * .py __

from other_dir import BaseParent

class Base(BaseParent):
    def login(self):
        pass

Dir / dir1 / gui_a.py

from Dir import Base

class Gui_A(Base):
    def __init__(self):
        super(Gui_A, self).__init__()

Dir / dir1 / gui_b.py

from Dir import Base

class Gui_B(Base):
    def __init__(self):
        super(Gui_B, self).__init__()

Dir / dir2 / Web.py

from Dir.dir1.gui_a import Gui_A
from Dir.dir1.gui_b import Gui_B

class Web():
    def __init__(self, version):
        if version == 'gen1':
            self.__class__ = Gui_A
        elif version == 'gen2':
            self.__class__ = Gui_B


if __name__ == "__main__":
    ob = Web("gen1")

Почему ошибка пытается указать, что Gui_A не является классом, из-за которого присвоение не может произойти?

1 Ответ

0 голосов
/ 10 января 2019

Это исключение может произойти в Python 2, если вы смешаете классы старого (классического) и нового стилей.

>>> class A(object):
...     # New style class (inherits from object)
...     pass
... 
>>> class B:
...    # Classic class - does not inherit from object
...    # or any other new-style class
...     def __init__(self):
...         self.__class__ = A
... 
>>> B()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __init__
TypeError: __class__ must be set to a class

Классы старого и нового стиля на самом деле разные типы:

>>> type(A)
<type 'type'>
>>> type(B)
<type 'classobj'>

так что вы не можете заменить одно другим. Новые классы стиля были введены в Python 2.2; любой современный код Python 2 должен использовать их исключительно, если только он не унаследован от класса старого стиля (я думаю, что в стандартной библиотеке их еще может быть).

В Python 3 классы старого стиля были исключены. Следовательно, в Python 3 классы могут быть объявлены как классы старого стиля; это объявление создаст класс старого стиля в Python 2, но класс нового стиля в Python 3:

class A:
    pass

Если вы создаете код Python 2 из примеров Python 3, важно знать об этой разнице.

...