Изучая модель данных Python, я играю с созданием объектов из существующих объектов с помощью метода __new__
. Вот несколько примеров, которые создают новые объекты разных типов:
x = 2; print type(x).__new__(x.__class__)
x = {}; print type(x).__new__(x.__class__)
x = [1,2]; print type(x).__new__(x.__class__)
x = 2.34; print type(x).__new__(x.__class__)
x = '13'; print type(x).__new__(x.__class__)
x = 1.0j; print type(x).__new__(x.__class__)
x = True; print type(x).__new__(x.__class__)
x = (1,2); print type(x).__new__(x.__class__)
Однако следующие три эксперимента дают мне ошибки:
x = None; print type(x).__new__(x.__class__)
x = lambda z: z**2; print type(x).__new__(x.__class__)
x = object; print type(x).__new__(x.__class__)
Ошибки (соответственно):
TypeError: object.__new__(NoneType) is not safe, use NoneType.__new__()
TypeError: Required argument 'code' (pos 1) not found
TypeError: type() takes 1 or 3 arguments
Почему эти три примера не работают? (Примечание: для примера lambda
кажется, что я должен передать фрагмент кода при вызове метода __new__
, но я не знаю, как это сделать.) Я использую Python 2.6.
Обратите внимание, что я понимаю, что это не обязательно так, как вы хотели бы создавать новые объекты в реальном коде, но моя цель непрактична, скорее, это понять, как работают методы объекта низкого уровня.