Я изучаю Python и до сих пор могу рассказать о вещах ниже __new__ и __init__:
-
__new__предназначен для создания объекта. -
__init__предназначен для инициализации объекта -
__new__вызывается перед__init__, поскольку__new__возвращает новый экземпляр и__init__, вызываемый впоследствии для инициализации внутреннего состояния. -
__new__хорош для неизменяемого объекта, поскольку они не могут быть изменены после их назначения. Таким образом, мы можем вернуть новый экземпляр с новым состоянием. - Мы можем использовать
__new__и__init__для изменяемого объекта, поскольку его внутреннее состояние можно изменить.
Но у меня есть еще вопросы.
- Когда я создаю новый экземпляр, например
a = MyClass("hello","world"), как эти аргументы передаются? Я имею в виду, как я должен структурировать класс, используя__init__и__new__, поскольку они разные, и оба принимают произвольные аргументы, кроме первого аргумента по умолчанию. -
selfключевое слово в терминах имени может быть изменено на что-то еще? Но мне интересно, чтоclsв терминах имени может быть изменен на что-то еще, поскольку это просто имя параметра?
Я сделал несколько экспериментов как таковые ниже:
>>> class MyClass(tuple):
def __new__(tuple):
return [1,2,3]
и я сделал следующее:
>>> a = MyClass()
>>> a
[1, 2, 3]
Хотя я сказал, что хочу вернуть tuple, этот код отлично работает и вернул мне [1,2,3]. Я знал, что мы передавали первые параметры в качестве типа, который мы хотели получить, после вызова функции __new__. Мы говорим о функции New правильно? Я не знаю, как другие языки возвращают тип, отличный от связанного типа?
И я тоже делал пытки:
>>> issubclass(MyClass,list)
False
>>> issubclass(MyClass,tuple)
True
>>> isinstance(a,MyClass)
False
>>> isinstance(a,tuple)
False
>>> isinstance(a,list)
True
Я больше не экспериментировал, потому что дальше не было яркого, и я решил остановиться там и решил спросить StackOverflow.
Сообщения SO, которые я прочитал: