So I was messing around with a readonly-modifyable class pattern which is pretty common in java
. It involves creating a base class containig readonly properties, and extending that class for a modifyable version. Usually there is a function readonly()
or something simular to revert a modifyable-version back to a readonly-version of itself.
Unfortunately you cannot directly define a setter for a property defined in a super class in python, but you can simply redefine it as shown below. Mor interestingly In python you got the 'magic function' super
returning a proxy-object of the parent/super class which allows for a cheecky readonly()
implementation which feels really hacky, but as far as I can test it just works.
class Readonly:
_t:int
def __init__(self, t: int):
self._t = t
@property
def t(self) -> int:
return self._t
class Modifyable(Readonly):
def __init__(self, t: int):
super().__init__(t)
@property
def t(self) -> int:
return self._t # can also be super().t
@t.setter
def t(self, t):
self._t = t
def readonly(self) -> Readonly:
return super()
In the above pattern I can call the readonly
function and obtain a proxy to the parent object without having to instantiate a readonly version. The only problem would be that when setting the readonly-attribute instead of throwing AttributeError: can't set attribute
, it will throw a AttributeError: 'super' object has no attribute '<param-name>'
So here are the question for this:
- Can this cause problems (exposing the
super
proxy-object outside the class itself)? - I tested this on python 3.8.5, but not sure if that is by accident and goes against the 'python-semantics' so to speak?
- Is there a better/more desirable way to achieve this? (I have no idea if its even worth the ambiguous error message in ragards to performance for example)
I Would love to hear opinions and/or insights into this
Aucun commentaire:
Enregistrer un commentaire