Как исправить эту ошибку TypeError за отсутствующий аргумент self

106
11

Получение 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. Я думаю, что это отредактированное описание может уточнить, что я хотел раньше. Извините за удобство.

спросил(а) 2021-01-19T15:02:45+03:00 2 месяца, 3 недели назад
1
Решение
114

К сожалению, __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

ответил(а) 2021-01-19T15:02:45+03:00 2 месяца, 3 недели назад
44

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

repr(c)

ответил(а) 2021-01-19T15:02:45+03:00 2 месяца, 3 недели назад
44

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


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))

ответил(а) 2021-01-19T15:02:45+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема