| from ctypes import * |
| import unittest |
| |
| class X(Structure): |
| _fields_ = [("a", c_int), |
| ("b", c_int)] |
| new_was_called = False |
| |
| def __new__(cls): |
| result = super().__new__(cls) |
| result.new_was_called = True |
| return result |
| |
| def __init__(self): |
| self.a = 9 |
| self.b = 12 |
| |
| class Y(Structure): |
| _fields_ = [("x", X)] |
| |
| |
| class InitTest(unittest.TestCase): |
| def test_get(self): |
| # make sure the only accessing a nested structure |
| # doesn't call the structure's __new__ and __init__ |
| y = Y() |
| self.failUnlessEqual((y.x.a, y.x.b), (0, 0)) |
| self.failUnlessEqual(y.x.new_was_called, False) |
| |
| # But explicitely creating an X structure calls __new__ and __init__, of course. |
| x = X() |
| self.failUnlessEqual((x.a, x.b), (9, 12)) |
| self.failUnlessEqual(x.new_was_called, True) |
| |
| y.x = x |
| self.failUnlessEqual((y.x.a, y.x.b), (9, 12)) |
| self.failUnlessEqual(y.x.new_was_called, False) |
| |
| if __name__ == "__main__": |
| unittest.main() |