Guest User

Untitled

a guest
Jun 18th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.58 KB | None | 0 0
  1. class DerivedClass(str):
  2.  
  3. def __new__(cls, string):
  4. ob = super(DerivedClass, cls).__new__(cls, string)
  5. return ob
  6.  
  7. def upper(self):
  8. #overridden, new functionality. Return ob of type DerivedClass. Great.
  9. caps = super(DerivedClass, self).upper()
  10. return DerivedClass(caps + '123')
  11.  
  12. derived = DerivedClass('a')
  13.  
  14. print derived.upper() #'A123'
  15. print type(derived.upper()) #<class '__main__.DerivedClass'>
  16. print derived.lower() #'a'
  17. print type(derived.lower()) #<type 'str'>
  18.  
  19. #Any massive flaws in the following?
  20.  
  21. class DerivedClass(str):
  22. def __new__(cls, string):
  23. ob = super(DerivedClass, cls).__new__(cls, string)
  24. return ob
  25.  
  26. def upper(self):
  27. caps = super(DerivedClass, self).upper()
  28. return DerivedClass(caps + '123')
  29.  
  30. def __getattribute__(self, name):
  31. att = super(DerivedClass, self).__getattribute__(name)
  32.  
  33. if not callable(att):
  34. return att
  35.  
  36. def call_me_later(*args, **kwargs):
  37. result = att(*args, **kwargs)
  38. if isinstance(result, basestring):
  39. return DerivedClass(result)
  40. return result
  41. return call_me_later
  42.  
  43. from functools import partial
  44.  
  45. class DerivedClass(str):
  46.  
  47. def __new__(cls, string):
  48. ob = super(DerivedClass, cls).__new__(cls, string)
  49. return ob
  50.  
  51. def upper(self):
  52. #overridden, new functionality. Return ob of type DerivedClass. Great.
  53. caps = super(DerivedClass, self).upper()
  54. return DerivedClass(caps + '123')
  55.  
  56. def __getattribute__(self, name):
  57. func = str.__getattribute__(self, name)
  58. if name == 'upper':
  59. return func
  60.  
  61. if not callable(func):
  62. return func
  63.  
  64. def call_me_later(*args, **kwargs):
  65. result = func(*args, **kwargs)
  66. # Some str functions return lists, ints, etc
  67. if isinstance(result, basestring:
  68. return DerivedClass(result)
  69. return result
  70.  
  71. return partial(call_me_later)
  72.  
  73. from functools import partial
  74.  
  75. class DerivedClass(str):
  76. def __new__(cls, string):
  77. ob = super(DerivedClass, cls).__new__(cls, string)
  78. return ob
  79.  
  80. def upper(self):
  81. caps = super(DerivedClass, self).upper()
  82. return DerivedClass(caps + '123')
  83.  
  84. def __getattribute__(self, name):
  85. if name in ['__dict__', '__members__', '__methods__', '__class__']:
  86. return object.__getattribute__(self, name)
  87. func = str.__getattribute__(self, name)
  88. if name in self.__dict__.keys() or not callable(func):
  89. return func
  90.  
  91. def call_me_later(*args, **kwargs):
  92. result = func(*args, **kwargs)
  93. # Some str functions return lists, ints, etc
  94. if isinstance(result, basestring):
  95. return DerivedClass(result)
  96. return result
  97.  
  98. return partial(call_me_later)
  99.  
  100. @do_overrides
  101. class Myst(str):
  102. def upper(self):
  103. ...&c...
  104.  
  105. def do_overrides(cls):
  106. done = set(dir(cls))
  107. base = cls.__bases__[0]
  108. def wrap(f):
  109. def wrapper(*a, **k):
  110. r = f(*a, **k)
  111. if isinstance(r, base):
  112. r = cls(r)
  113. return r
  114. for m in dir(base):
  115. if m in done or not callable(m):
  116. continue
  117. setattr(cls, m, wrap(getattr(base, m)))
  118.  
  119. def __getattribute__(self, name):
  120. # Simple hardcoded check for upper.
  121. # I'm sure there are better ways to get the list of defined methods in
  122. # your class and see if name is contained in it.
  123. if name == 'upper':
  124. return object.__getattribute__(self, name)
  125.  
  126. return DerivedClass(object.__getattribute__(self, name))
Add Comment
Please, Sign In to add comment