400_class.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. class A:
  2. def __init__(self, a, b):
  3. self.a = a
  4. self.b = b
  5. def add(self):
  6. return self.a + self.b
  7. def sub(self):
  8. return self.a - self.b
  9. a = A(1, 2)
  10. assert a.add() == 3
  11. assert a.sub() == -1
  12. assert A.__base__ is object
  13. class B(A):
  14. def __init__(self, a, b, c):
  15. super(B, self).__init__(a, b)
  16. self.c = c
  17. def add(self):
  18. return self.a + self.b + self.c
  19. def sub(self):
  20. return self.a - self.b - self.c
  21. assert B.__base__ is A
  22. b = B(1, 2, 3)
  23. assert b.add() == 6
  24. assert b.sub() == -4
  25. class C(B):
  26. def __init__(self, a, b, c, d):
  27. super(C, self).__init__(a, b, c)
  28. self.d = d
  29. def add(self):
  30. return self.a + self.b + self.c + self.d
  31. def sub(self):
  32. return self.a - self.b - self.c - self.d
  33. assert C.__base__ is B
  34. c = C(1, 2, 3, 4)
  35. assert c.add() == 10
  36. assert c.sub() == -8
  37. class D(C):
  38. def __init__(self, a, b, c, d, e):
  39. super(D, self).__init__(a, b, c, d)
  40. self.e = e
  41. def add(self):
  42. return super(D, self).add() + self.e
  43. def sub(self):
  44. return super(D, self).sub() - self.e
  45. assert D.__base__ is C
  46. d = D(1, 2, 3, 4, 5)
  47. assert d.add() == 15
  48. assert d.sub() == -13
  49. assert isinstance(1, int)
  50. assert isinstance(1, object)
  51. assert isinstance(C, type)
  52. assert isinstance(C, object)
  53. assert isinstance(d, object)
  54. assert isinstance(d, C)
  55. assert isinstance(d, B)
  56. assert isinstance(d, A)
  57. assert isinstance(object, object)
  58. assert isinstance(type, object)
  59. assert isinstance(1, (float, int))
  60. assert isinstance(1, (float, object))
  61. assert not isinstance(1, (float, str))
  62. assert isinstance(object, (int, type, float))
  63. assert not isinstance(object, (int, float, str))
  64. try:
  65. isinstance(1, (1, 2))
  66. exit(1)
  67. except TypeError:
  68. pass
  69. try:
  70. isinstance(1, 1)
  71. exit(1)
  72. except TypeError:
  73. pass
  74. class A:
  75. a = 1
  76. b = 2
  77. assert A.a == 1
  78. assert A.b == 2
  79. class B(A):
  80. b = 3
  81. c = 4
  82. assert B.b == 3
  83. assert B.c == 4
  84. assert B.a == 1
  85. class A:
  86. x = 1
  87. x = x + 1
  88. y = 1
  89. z = x + y
  90. assert A.x == 2
  91. assert A.y == 1
  92. assert A.z == 3
  93. class MyClass:
  94. a = 1,2,3
  95. b, c = 1, 2
  96. d = b + c
  97. def __init__(self, m, n) -> None:
  98. self.m: int = m
  99. self.n: float = n
  100. assert MyClass.a == (1, 2, 3)
  101. assert MyClass.b == 1
  102. assert MyClass.c == 2
  103. assert MyClass.d == 3
  104. assert MyClass(1, 2).m == 1
  105. class E: pass
  106. try:
  107. E(1,2,3)
  108. exit(1)
  109. except TypeError:
  110. pass
  111. class E1:
  112. def __new__(cls, a, b):
  113. o = object.__new__(cls)
  114. o.a = a
  115. o.b = b
  116. return o
  117. def sum(self):
  118. return self.a + self.b
  119. e1 = E1(3,4)
  120. assert e1.sum() == 7
  121. # `__new__`/`__init__` are resolved once and cached on the type, so rebinding
  122. # them later has to invalidate that cache -- for the type and for its subclasses.
  123. class CacheA:
  124. def __init__(self):
  125. self.tag = 'old'
  126. assert CacheA().tag == 'old'
  127. def _new_init(self):
  128. self.tag = 'new'
  129. CacheA.__init__ = _new_init
  130. assert CacheA().tag == 'new'
  131. class CacheBase: pass
  132. class CacheDerived(CacheBase): pass
  133. CacheDerived() # populate the cache before the base is touched
  134. def _base_init(self):
  135. self.tag = 'base'
  136. CacheBase.__init__ = _base_init
  137. assert CacheDerived().tag == 'base'
  138. class CacheC:
  139. def __init__(self):
  140. self.tag = 'c'
  141. assert CacheC().tag == 'c'
  142. del CacheC.__init__
  143. try:
  144. CacheC().tag
  145. exit(1)
  146. except AttributeError:
  147. pass