Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save hotohoto/b28147d457cc9bbe620cf389a0f2109d to your computer and use it in GitHub Desktop.
Save hotohoto/b28147d457cc9bbe620cf389a0f2109d to your computer and use it in GitHub Desktop.
To modify a class, use composite pattern instead of inheriting a base class
class BaseClass:
def __init__(self, _id, a, k=None):
self.id = _id
self.a = a
self.k = k
def updated(self, **kwargs):
kwargs = {"k": self.k, **kwargs}
return BaseClass(self.id, self.a, **kwargs)
def say_it(self):
self.k *= -1
print(f"hello! {self.k}")
def __repr__(self):
return f"BaseClass({self.id}, {self.a}, k={self.k})"
class ModifiedClass:
def __init__(self, *args, **kwargs):
assert len(args) == 1
self._BaseClass = BaseClass(None, *args, **kwargs)
def __getattr__(self, name):
if name == "id":
raise AttributeError("a ModifiedClass is not identifiable")
try:
return getattr(self._BaseClass, name)
except AttributeError:
pass
raise AttributeError(f"'ModifiedClass' object has no attribute '{name}'")
def updated(self, **kwargs):
return self.from_BaseClass(self._BaseClass, **kwargs)
def __repr__(self):
return f"ModifiedClass({self.a}, k={self.k})"
@staticmethod
def from_BaseClass(BaseClass: BaseClass, **kwargs):
kwargs = {"k": BaseClass.k, **kwargs}
return ModifiedClass(BaseClass.a, **kwargs)
d = BaseClass(3, 4, k=5)
u = d.updated(k=6)
print(d)
print(u)
print(u.a, u.k, u.id)
print(isinstance(u, BaseClass))
u.say_it()
print()
t = ModifiedClass(4, k=5)
u = t.updated(k=6)
print(t)
print(u)
print(u.a, u.k, u._BaseClass)
print(isinstance(u, BaseClass))
u.say_it()
u.say_it()
# u.z
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment