| 474 | self.assertEqual(a[100:200], (100,200)) |
| 475 | |
| 476 | def test_metaclass(self): |
| 477 | # Testing metaclasses... |
| 478 | class C(metaclass=type): |
| 479 | def __init__(self): |
| 480 | self.__state = 0 |
| 481 | def getstate(self): |
| 482 | return self.__state |
| 483 | def setstate(self, state): |
| 484 | self.__state = state |
| 485 | a = C() |
| 486 | self.assertEqual(a.getstate(), 0) |
| 487 | a.setstate(10) |
| 488 | self.assertEqual(a.getstate(), 10) |
| 489 | class _metaclass(type): |
| 490 | def myself(cls): return cls |
| 491 | class D(metaclass=_metaclass): |
| 492 | pass |
| 493 | self.assertEqual(D.myself(), D) |
| 494 | d = D() |
| 495 | self.assertEqual(d.__class__, D) |
| 496 | class M1(type): |
| 497 | def __new__(cls, name, bases, dict): |
| 498 | dict['__spam__'] = 1 |
| 499 | return type.__new__(cls, name, bases, dict) |
| 500 | class C(metaclass=M1): |
| 501 | pass |
| 502 | self.assertEqual(C.__spam__, 1) |
| 503 | c = C() |
| 504 | self.assertEqual(c.__spam__, 1) |
| 505 | |
| 506 | class _instance(object): |
| 507 | pass |
| 508 | class M2(object): |
| 509 | @staticmethod |
| 510 | def __new__(cls, name, bases, dict): |
| 511 | self = object.__new__(cls) |
| 512 | self.name = name |
| 513 | self.bases = bases |
| 514 | self.dict = dict |
| 515 | return self |
| 516 | def __call__(self): |
| 517 | it = _instance() |
| 518 | # Early binding of methods |
| 519 | for key in self.dict: |
| 520 | if key.startswith("__"): |
| 521 | continue |
| 522 | setattr(it, key, self.dict[key].__get__(it, self)) |
| 523 | return it |
| 524 | class C(metaclass=M2): |
| 525 | def spam(self): |
| 526 | return 42 |
| 527 | self.assertEqual(C.name, 'C') |
| 528 | self.assertEqual(C.bases, ()) |
| 529 | self.assertIn('spam', C.dict) |
| 530 | c = C() |
| 531 | self.assertEqual(c.spam(), 42) |
| 532 | |
| 533 | # More metaclass examples |