aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPaul Sokolovsky2014-05-22 00:32:00 +0300
committerPaul Sokolovsky2014-05-22 00:32:00 +0300
commit806ea1f6ca2b1b50bb4634be6c39ad83d8af7e89 (patch)
tree6ff486c9fc6e76cf2e6b984d01a1f28b55432149 /tests
parent0c937fa25a1a78274ba974a5c1546c0a01106c30 (diff)
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.
Diffstat (limited to 'tests')
-rw-r--r--tests/basics/class_new.py21
-rw-r--r--tests/basics/object_new.py20
2 files changed, 41 insertions, 0 deletions
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)