fork download
  1. # (c) Reflection 2026 Baltasar MIT License <jbgarcia@uvigo.es>
  2.  
  3.  
  4. def to_dict(obj):
  5. id_members = dir(obj)
  6. toret = {}
  7.  
  8. for id_member in id_members:
  9. val = getattr(obj, id_member)
  10. toret[id_member] = val
  11.  
  12. return toret
  13.  
  14.  
  15. def to_str_list(obj):
  16. members = to_dict(obj)
  17. toret = type(obj).__name__ + ":\n"
  18.  
  19. for id_member in members.keys():
  20. val = getattr(obj, id_member)
  21. if callable(val):
  22. toret += "\t" + id_member + "()\n"
  23. else:
  24. qt = ""
  25. if isinstance(val, str):
  26. qt = '\"'
  27. toret += f"\t{id_member}: {qt}{val}{qt}\n"
  28.  
  29. return toret
  30.  
  31.  
  32. class SuperHero:
  33. def __init__(self, name, alter_ego, power):
  34. self._name = name
  35. self._alter_ego = alter_ego
  36. self._power = power
  37. self._transformed = False
  38.  
  39. def transform(self):
  40. self._transformed = not(self._transformed)
  41.  
  42. def __getattr__(self, atr_name):
  43. if atr_name == "name":
  44. return self._alter_ego if self._transformed else self._name
  45.  
  46. if atr_name == "power":
  47. return 0 if not self._transformed else self._power
  48.  
  49. if atr_name == "is_transformed":
  50. return lambda: self._transformed
  51.  
  52. return AttributeError(atr_name)
  53.  
  54. def __getattribute__(self, atr_name):
  55. if (atr_name == "transform"
  56. and self._name == "Bruce Banner"
  57. and self._transformed):
  58. return lambda: None
  59.  
  60. return super().__getattribute__(atr_name)
  61.  
  62. def __str__(self):
  63. return f"{self.name}/{self.power} {'*' if self.is_transformed() else ''}"
  64.  
  65.  
  66. class Struct:
  67. def __setattr__(self, atr_name, val):
  68. self.__dict__["_" + atr_name] = val
  69.  
  70. def __getattr__(self, atr_name):
  71. toret = self.__dict__["_" + atr_name]
  72.  
  73. if not toret:
  74. raise AttributeError(atr_name)
  75.  
  76. return toret
  77.  
  78. def __str__(self):
  79. pairs = self.__dict__.items()
  80. return ("{"
  81. + str.join(", ", [pair[0][1:] + ": " + str(pair[1]) for pair in pairs])
  82. + "}")
  83.  
  84.  
  85. class Sequence:
  86. def __init__(self):
  87. self._l = []
  88.  
  89. def __iadd__(self, val):
  90. self._l.append(val)
  91. return self
  92.  
  93. def __getitem__(self, item):
  94. return self._l[item]
  95.  
  96. def __len__(self):
  97. return len(self._l)
  98.  
  99. def __str__(self):
  100. return str.join(", ", [str(x) for x in self._l])
  101.  
  102.  
  103. def chk_listing():
  104. from superhero import SuperHero
  105.  
  106. s1 = SuperHero("Clark Kent", "Superman", 100_000_000)
  107. print(to_dict(s1))
  108. print(to_dict(123))
  109. print(to_dict("a"))
  110.  
  111. print(to_str_list(s1))
  112. print(to_str_list(123))
  113. print(to_str_list("a"))
  114.  
  115.  
  116. def chk_superheroes():
  117. superheroes = [
  118. SuperHero("Clark Kent", "Superman", 100000000),
  119. SuperHero("Bruce Banner", "Hulk", 100000)]
  120.  
  121. print("--- Pasando de humanos normales a superhéroes")
  122. for superhero in superheroes:
  123. print(f"\n{superhero}")
  124. superhero.transform()
  125. print(superhero)
  126.  
  127. print("\n\n--- Transformando a Hulk (pero no se puede)")
  128. superheroes[1].transform()
  129. print(superheroes[1])
  130.  
  131.  
  132. def chk_sequence():
  133. s1 = Sequence()
  134. s1 += 0x000000
  135. s1 += 0x0000ff
  136. s1 += 0xff00ff
  137. s1 += 0x00ff00
  138. s1 += 0x00ffff
  139. s1 += 0xffffff
  140.  
  141. for i, color in enumerate(s1):
  142. print(f"Color {i + 1}:", color)
  143.  
  144. print(s1)
  145. print(f"#s1={len(s1)}, s1[2]={s1[2]}")
  146.  
  147.  
  148. def chk_struct():
  149. s1 = Struct()
  150. s1.model = "A3"
  151. s1.maker = "Audi"
  152. s1.style = "Sportback"
  153. s2 = Struct()
  154. s2.name = "Raymond Poulidor"
  155. s2.team = "Mercier"
  156. print(s1)
  157. print(f"{s1.maker} {s1.model} {s1.style}")
  158. print(s2)
  159. print(f"{s2.name} ({s2.team})")
  160.  
  161.  
  162. if __name__ == "__main__":
  163. #chk_listing()
  164. #chk_struct()
  165. #chk_superheroes()
  166. chk_sequence()
  167.  
  168.  
Success #stdin #stdout 0.03s 9504KB
stdin
Standard input is empty
stdout
Color 1: 0
Color 2: 255
Color 3: 16711935
Color 4: 65280
Color 5: 65535
Color 6: 16777215
0, 255, 16711935, 65280, 65535, 16777215
#s1=6, s1[2]=16711935