@@ -4171,38 +4171,129 @@ class OverrideDecoratorTests(BaseTestCase):
4171
4171
def test_override (self ):
4172
4172
class Base :
4173
4173
def normal_method (self ): ...
4174
+ @classmethod
4175
+ def class_method_good_order (cls ): ...
4176
+ @classmethod
4177
+ def class_method_bad_order (cls ): ...
4174
4178
@staticmethod
4175
4179
def static_method_good_order (): ...
4176
4180
@staticmethod
4177
4181
def static_method_bad_order (): ...
4178
- @staticmethod
4179
- def decorator_with_slots (): ...
4180
4182
4181
4183
class Derived (Base ):
4182
4184
@override
4183
4185
def normal_method (self ):
4184
4186
return 42
4185
4187
4188
+ @classmethod
4189
+ @override
4190
+ def class_method_good_order (cls ):
4191
+ return 42
4192
+ @override
4193
+ @classmethod
4194
+ def class_method_bad_order (cls ):
4195
+ return 42
4196
+
4186
4197
@staticmethod
4187
4198
@override
4188
4199
def static_method_good_order ():
4189
4200
return 42
4190
-
4191
4201
@override
4192
4202
@staticmethod
4193
4203
def static_method_bad_order ():
4194
4204
return 42
4195
4205
4196
-
4197
4206
self .assertIsSubclass (Derived , Base )
4198
4207
instance = Derived ()
4199
4208
self .assertEqual (instance .normal_method (), 42 )
4209
+ self .assertIs (True , Derived .normal_method .__override__ )
4200
4210
self .assertIs (True , instance .normal_method .__override__ )
4211
+
4212
+ self .assertEqual (Derived .class_method_good_order (), 42 )
4213
+ self .assertIs (True , Derived .class_method_good_order .__override__ )
4214
+ self .assertEqual (Derived .class_method_bad_order (), 42 )
4215
+ self .assertIs (False , hasattr (Derived .class_method_bad_order , "__override__" ))
4216
+
4201
4217
self .assertEqual (Derived .static_method_good_order (), 42 )
4202
4218
self .assertIs (True , Derived .static_method_good_order .__override__ )
4203
4219
self .assertEqual (Derived .static_method_bad_order (), 42 )
4204
4220
self .assertIs (False , hasattr (Derived .static_method_bad_order , "__override__" ))
4205
4221
4222
+ # Base object is not changed:
4223
+ self .assertIs (False , hasattr (Base .normal_method , "__override__" ))
4224
+ self .assertIs (False , hasattr (Base .class_method_good_order , "__override__" ))
4225
+ self .assertIs (False , hasattr (Base .class_method_bad_order , "__override__" ))
4226
+ self .assertIs (False , hasattr (Base .static_method_good_order , "__override__" ))
4227
+ self .assertIs (False , hasattr (Base .static_method_bad_order , "__override__" ))
4228
+
4229
+ def test_property (self ):
4230
+ class Base :
4231
+ @property
4232
+ def correct (self ) -> int :
4233
+ return 1
4234
+ @property
4235
+ def wrong (self ) -> int :
4236
+ return 1
4237
+
4238
+ class Child (Base ):
4239
+ @property
4240
+ @override
4241
+ def correct (self ) -> int :
4242
+ return 2
4243
+ @override
4244
+ @property
4245
+ def wrong (self ) -> int :
4246
+ return 2
4247
+
4248
+ instance = Child ()
4249
+ self .assertEqual (instance .correct , 2 )
4250
+ self .assertTrue (Child .correct .fget .__override__ )
4251
+ self .assertEqual (instance .wrong , 2 )
4252
+ self .assertFalse (hasattr (Child .wrong , "__override__" ))
4253
+ self .assertFalse (hasattr (Child .wrong .fset , "__override__" ))
4254
+
4255
+ def test_silent_failure (self ):
4256
+ class CustomProp :
4257
+ __slots__ = ('fget' ,)
4258
+ def __init__ (self , fget ):
4259
+ self .fget = fget
4260
+ def __get__ (self , obj , objtype = None ):
4261
+ return self .fget (obj )
4262
+
4263
+ class WithOverride :
4264
+ @override # must not fail on object with `__slots__`
4265
+ @CustomProp
4266
+ def some (self ):
4267
+ return 1
4268
+
4269
+ self .assertEqual (WithOverride .some , 1 )
4270
+ self .assertFalse (hasattr (WithOverride .some , "__override__" ))
4271
+
4272
+ def test_multiple_decorators (self ):
4273
+ import functools
4274
+
4275
+ def with_wraps (f ): # similar to `lru_cache` definition
4276
+ @functools .wraps (f )
4277
+ def wrapper (* args , ** kwargs ):
4278
+ return f (* args , ** kwargs )
4279
+ return wrapper
4280
+
4281
+ class WithOverride :
4282
+ @override
4283
+ @with_wraps
4284
+ def on_top (self , a : int ) -> int :
4285
+ return a + 1
4286
+ @with_wraps
4287
+ @override
4288
+ def on_bottom (self , a : int ) -> int :
4289
+ return a + 2
4290
+
4291
+ instance = WithOverride ()
4292
+ self .assertEqual (instance .on_top (1 ), 2 )
4293
+ self .assertTrue (instance .on_top .__override__ )
4294
+ self .assertEqual (instance .on_bottom (1 ), 3 )
4295
+ self .assertTrue (instance .on_bottom .__override__ )
4296
+
4206
4297
4207
4298
class CastTests (BaseTestCase ):
4208
4299
0 commit comments