Skip to content

Instantly share code, notes, and snippets.

@cbcunc
Created September 28, 2020 21:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cbcunc/4c797c88e96d9a2bd32d77dda3e18e21 to your computer and use it in GitHub Desktop.
Save cbcunc/4c797c88e96d9a2bd32d77dda3e18e21 to your computer and use it in GitHub Desktop.
Nested Properties
class Outer(object):
"""
>>> Outer.class_attr
'ca0'
>>> outer = Outer("ia0", "ia1", "ia2")
>>> outer.inst_attr
'ia0'
>>> outer.inner
<__main__.Outer.Inner object at 0x...>
>>> outer.inner.class_attr
'ca1'
>>> outer.inner.outer
<__main__.Outer object at 0x...>
>>> outer.inner.inst_attr
'ia1'
>>> outer.inner.enclosed_class_attr
'ca0'
>>> outer.inner.enclosed_inst_attr
'ia0'
>>> outer.inner.inner
<__main__.Outer.Inner.Inner object at 0x...>
>>> outer.inner.inner.class_attr
'ca2'
>>> outer.inner.inner.outer
<__main__.Outer.Inner object at 0x...>
>>> outer.inner.inner.inst_attr
'ia2'
>>> outer.inner.inner.enclosed_class_attr
'ca1'
>>> outer.inner.inner.enclosed_inst_attr
'ia1'
>>> outer.inner.inner.twice_enclosed_class_attr
'ca0'
>>> outer.inner.inner.twice_enclosed_inst_attr
'ia0'
"""
class_attr = "ca0"
def __init__(self, ia0=None, ia1=None, ia2=None):
self.inst_attr = ia0
self._inner = self.Inner(self, ia1=ia1, ia2=ia2)
@property
def inner(self):
return self._inner
class Inner(object):
class_attr = "ca1"
def __init__(self, outer, ia1=None, ia2=None):
self.outer = outer
self.inst_attr = ia1
self.enclosed_class_attr = outer.class_attr
self.enclosed_inst_attr = outer.inst_attr
self._inner = self.Inner(self, ia2=ia2)
@property
def inner(self):
return self._inner
class Inner(object):
class_attr = "ca2"
def __init__(self, outer, ia2=None):
self.outer = outer
self.inst_attr = ia2
self.enclosed_class_attr = outer.class_attr
self.enclosed_inst_attr = outer.inst_attr
self.twice_enclosed_class_attr = outer.outer.class_attr
self.twice_enclosed_inst_attr = outer.outer.inst_attr
if __name__ == "__main__":
import doctest
doctest.testmod(optionflags=doctest.ELLIPSIS)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment