Я изучаю 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, которые я прочитал: