(self)
| 4069 | int().__rpow__, 1, 2, 3) |
| 4070 | |
| 4071 | def test_mutable_bases(self): |
| 4072 | # Testing mutable bases... |
| 4073 | |
| 4074 | # stuff that should work: |
| 4075 | class C(object): |
| 4076 | pass |
| 4077 | class C2(object): |
| 4078 | def __getattribute__(self, attr): |
| 4079 | if attr == 'a': |
| 4080 | return 2 |
| 4081 | else: |
| 4082 | return super(C2, self).__getattribute__(attr) |
| 4083 | def meth(self): |
| 4084 | return 1 |
| 4085 | class D(C): |
| 4086 | pass |
| 4087 | class E(D): |
| 4088 | pass |
| 4089 | d = D() |
| 4090 | e = E() |
| 4091 | D.__bases__ = (C,) |
| 4092 | D.__bases__ = (C2,) |
| 4093 | self.assertEqual(d.meth(), 1) |
| 4094 | self.assertEqual(e.meth(), 1) |
| 4095 | self.assertEqual(d.a, 2) |
| 4096 | self.assertEqual(e.a, 2) |
| 4097 | self.assertEqual(C2.__subclasses__(), [D]) |
| 4098 | |
| 4099 | try: |
| 4100 | del D.__bases__ |
| 4101 | except (TypeError, AttributeError): |
| 4102 | pass |
| 4103 | else: |
| 4104 | self.fail("shouldn't be able to delete .__bases__") |
| 4105 | |
| 4106 | try: |
| 4107 | D.__bases__ = () |
| 4108 | except TypeError as msg: |
| 4109 | if str(msg) == "a new-style class can't have only classic bases": |
| 4110 | self.fail("wrong error message for .__bases__ = ()") |
| 4111 | else: |
| 4112 | self.fail("shouldn't be able to set .__bases__ to ()") |
| 4113 | |
| 4114 | try: |
| 4115 | D.__bases__ = (D,) |
| 4116 | except TypeError: |
| 4117 | pass |
| 4118 | else: |
| 4119 | # actually, we'll have crashed by here... |
| 4120 | self.fail("shouldn't be able to create inheritance cycles") |
| 4121 | |
| 4122 | try: |
| 4123 | D.__bases__ = (C, C) |
| 4124 | except TypeError: |
| 4125 | pass |
| 4126 | else: |
| 4127 | self.fail("didn't detect repeated base classes") |
| 4128 |
nothing calls this directly
no test coverage detected