@Bright144

Как передать собственный класс на метод в качестве параметра по умолчании?

Я пытаюсь передать собственный класс на метод в качестве параметра по умолчании но у меня не получается. Долго возился в гугле, не мог найти, или я не могу формулировать правильный вопрос.
Вот что я хочу сделать:
class Test:
    def test(self, x=Test()):
        print(type(x))

x = Test()
x.test()

Можно ли такое осуществлять? Или такое не стоит сделать даже если возможно?
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
Mike_Ro
@Mike_Ro Куратор тега Python
Python, JS, WordPress, SEO, Bots, Adversting
Как передать собственный класс на метод в качестве параметра по умолчании?

Можно ли такое осуществлять? Или такое не стоит сделать даже если возможно?

Можно. Не стоит.

Значение аргументов по умолчанию в функции вычисляется в момент объявления функции, а не в момент обращения к ней.

Например, экземпляр класса Test, который Вы пытаетесь использовать в качестве значения по умолчанию, будет создан в момент определения метода test, что может быть не тем, что Вы ожидаете и может привести к сложно отлаживаемым ошибкам из за неочевидного разделения состояния между экземплярами.

Также, Ваш код приведет к ошибке, так как в момент определения метода test класс Test еще не полностью определен, и Вы не можете создать его экземпляр.

Вместо этого, можно использовать None для аргумента по умолчанию, а внутри метода проверять, был ли передан аргумент, и если нет, то создавать новый экземпляр класса:
class Test:
    def test(self, x=None):
        if x is None:
            x = Test()
        print(type(x))

x = Test()
x.test()

Поделитесь целью использования такой схемы?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
febday
@febday
Если только так:
class Test(object):
	def __init__(self, x: 'Test' = None):
		if x is None:
			x = self
		print(x)


Ну я думаю вы понимаете, что x будет присвоен абсолютно тоже класс, а не создаться новый
Не очень пойму вообще где такое можно использовать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы