Как исправить эту ошибку TypeError за отсутствующий аргумент self - PullRequest
0 голосов
/ 30 января 2019

Получение TypeError для тех методов, в которых я использовал self в качестве параметра типа missing 1 required positional argument: 'self'.Если метод имеет более 1 аргумента, включая self, он показывает аналогичную ошибку пропуска другого позиционного аргумента.

Я начал с создания одноэлементного объекта, который проверяет свои собственные ссылки, чтобы сохранить его особенность.Для этого я использовал __new__.

core.py

import pyglet.window

class Core(object):

    def __new__(cls, *args, **kwargs):
        if not cls:
            cls = object.__new__(cls, *args, **kwargs)
        return cls

    def __init__(self):
        self._instance = None
        self._window = None

    def __repr__(self):
        return '<%s object at %s>' % (Core.__name__, hex(id(Core)))

    def scene(self, width, height):
        self._window = pyglet.window.Window(width=width, height=height)

script.py

from core import Core

c = Core()
print(c.__repr__())
c.scene(640, 480)

ошибки:

    print(c.__repr__())
TypeError: __repr__() missing 1 required positional argument: 'self'

    c.scene(640, 480)
TypeError: scene() missing 1 required positional argument: 'height'

Этот метод не единственный случай, поэтому я хочу понять, что происходит и как это исправить.Спасибо за ваше время.

Редактировать:

Это не проблема только с __repr__.Я хочу, чтобы другие методы, такие как scene(self, width, height) или любые методы, которые вы могли бы создать, имели self в качестве одного параметра.Вторая ошибка, показывающая, какую ошибку дает этот код с другими методами

Мне нужен класс Core для создания одноэлементного объекта, чтобы я мог использовать другие файлы для ссылки на эту вещь Core._window.Я думаю, что это отредактированное описание может уточнить, что я хотел раньше.Извините за удобство.

Ответы [ 3 ]

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

Упс, __new__ получает класс и должен вернуть вновь созданный объект!Поскольку ваш код возвращает сам класс, все идет не так.Вы должны иметь:

class Core(object):

    def __new__(cls, *args, **kwargs):
        obj = object.__new__(cls, *args, **kwargs)
        return obj
    ...

И в любом случае __new__ - это расширенная конфигурация, в основном используемая для неизменяемых объектов, которые нельзя настроить в __init__.В вашем примере вы должны просто удалить его:

class Core(object):

    def __init__(self):
        self._instance = None
        self._window = None

    def __repr__(self):
        return '<%s object at %s>' % (Core.__name__, hex(id(Core)))

Этого достаточно для обычных объектов.Вы действительно можете использовать __new__ для создания синглетонов и даже использовать его для построения иерархий синглетонов, что означает, что каждый подкласс Core будет синглтоном:

class Core(object):
    _obj = None
    def __new__(cls, *args, **kwargs):
        if cls._obj is None or not isinstance(cls._obj, cls):
            cls._obj = object.__new__(cls, *args, **kwargs)
        return cls._obj

    def __init__(self):
        self._instance = None
        self._window = None

    def __repr__(self):
        return '<%s object at %s>' % (Core.__name__, hex(id(self)))

Обратите внимание, что мой класс __repr__ используетid(self) для идентификации объекта, а не класса.

Демо:

>>> c = Core()
>>> d = Core()
>>> c is d
True
>>> class Child(Core):
    pass

>>> ch = Child()
>>> ch is c
False
>>> ch2 = Child()
>>> ch2 is ch
True
0 голосов
/ 30 января 2019

Ваш код почти работает.Посмотрите здесь:

class Core(object):

    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = object.__new__(cls, *args, **kwargs)
        return cls._instance

    def __init__(self):
        pass

    def __repr__(self):
        return '<%s object at %s>' % (Core.__name__, hex(id(self)))

core = Core()
print(id(core))

core1 = Core()
print(id(core1))

print(repr(core))
print(repr(core1))
0 голосов
/ 30 января 2019

Правильный способ - использовать repr, например:

repr(c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...