From 806ea1f6ca2b1b50bb4634be6c39ad83d8af7e89 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 22 May 2014 00:32:00 +0300 Subject: py: Initial attempts to actually allow implementing __new__ in Python. Caveat is that __new__ should recurse to base class __new__, and ultimately, object.__new__ is what handles instance allocation. --- tests/basics/class_new.py | 21 +++++++++++++++++++++ tests/basics/object_new.py | 20 ++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 tests/basics/class_new.py create mode 100644 tests/basics/object_new.py (limited to 'tests') diff --git a/tests/basics/class_new.py b/tests/basics/class_new.py new file mode 100644 index 000000000..7fedcab6c --- /dev/null +++ b/tests/basics/class_new.py @@ -0,0 +1,21 @@ +class A: + + @staticmethod + def __new__(cls): + print("A.__new__") + return super(cls, A).__new__(cls) + + def __init__(self): + pass + + def meth(self): + pass + +#print(A.__new__) +#print(A.__init__) + +a = A() + +#print(a.meth) +#print(a.__init__) +#print(a.__new__) diff --git a/tests/basics/object_new.py b/tests/basics/object_new.py new file mode 100644 index 000000000..6131ed337 --- /dev/null +++ b/tests/basics/object_new.py @@ -0,0 +1,20 @@ +# object.__new__(cls) is the only way in Python to allocate empty +# (non-initialized) instance of class. +# See e.g. http://infohost.nmt.edu/tcc/help/pubs/python/web/new-new-method.html +# TODO: Find reference in CPython docs + +class Foo: + + def __init__(self): + print("in __init__") + self.attr = "something" + + +o = object.__new__(Foo) +#print(o) +print(hasattr(o, "attr")) +print(isinstance(o, Foo)) +o.__init__() +#print(dir(o)) +print(hasattr(o, "attr")) +print(o.attr) -- cgit v1.2.3