Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class DerivedClass(str):
- def __new__(cls, string):
- ob = super(DerivedClass, cls).__new__(cls, string)
- return ob
- def upper(self):
- #overridden, new functionality. Return ob of type DerivedClass. Great.
- caps = super(DerivedClass, self).upper()
- return DerivedClass(caps + '123')
- derived = DerivedClass('a')
- print derived.upper() #'A123'
- print type(derived.upper()) #<class '__main__.DerivedClass'>
- print derived.lower() #'a'
- print type(derived.lower()) #<type 'str'>
- #Any massive flaws in the following?
- class DerivedClass(str):
- def __new__(cls, string):
- ob = super(DerivedClass, cls).__new__(cls, string)
- return ob
- def upper(self):
- caps = super(DerivedClass, self).upper()
- return DerivedClass(caps + '123')
- def __getattribute__(self, name):
- att = super(DerivedClass, self).__getattribute__(name)
- if not callable(att):
- return att
- def call_me_later(*args, **kwargs):
- result = att(*args, **kwargs)
- if isinstance(result, basestring):
- return DerivedClass(result)
- return result
- return call_me_later
- from functools import partial
- class DerivedClass(str):
- def __new__(cls, string):
- ob = super(DerivedClass, cls).__new__(cls, string)
- return ob
- def upper(self):
- #overridden, new functionality. Return ob of type DerivedClass. Great.
- caps = super(DerivedClass, self).upper()
- return DerivedClass(caps + '123')
- def __getattribute__(self, name):
- func = str.__getattribute__(self, name)
- if name == 'upper':
- return func
- if not callable(func):
- return func
- def call_me_later(*args, **kwargs):
- result = func(*args, **kwargs)
- # Some str functions return lists, ints, etc
- if isinstance(result, basestring:
- return DerivedClass(result)
- return result
- return partial(call_me_later)
- from functools import partial
- class DerivedClass(str):
- def __new__(cls, string):
- ob = super(DerivedClass, cls).__new__(cls, string)
- return ob
- def upper(self):
- caps = super(DerivedClass, self).upper()
- return DerivedClass(caps + '123')
- def __getattribute__(self, name):
- if name in ['__dict__', '__members__', '__methods__', '__class__']:
- return object.__getattribute__(self, name)
- func = str.__getattribute__(self, name)
- if name in self.__dict__.keys() or not callable(func):
- return func
- def call_me_later(*args, **kwargs):
- result = func(*args, **kwargs)
- # Some str functions return lists, ints, etc
- if isinstance(result, basestring):
- return DerivedClass(result)
- return result
- return partial(call_me_later)
- @do_overrides
- class Myst(str):
- def upper(self):
- ...&c...
- def do_overrides(cls):
- done = set(dir(cls))
- base = cls.__bases__[0]
- def wrap(f):
- def wrapper(*a, **k):
- r = f(*a, **k)
- if isinstance(r, base):
- r = cls(r)
- return r
- for m in dir(base):
- if m in done or not callable(m):
- continue
- setattr(cls, m, wrap(getattr(base, m)))
- def __getattribute__(self, name):
- # Simple hardcoded check for upper.
- # I'm sure there are better ways to get the list of defined methods in
- # your class and see if name is contained in it.
- if name == 'upper':
- return object.__getattribute__(self, name)
- return DerivedClass(object.__getattribute__(self, name))
Add Comment
Please, Sign In to add comment