Created
September 28, 2020 21:08
-
-
Save cbcunc/4c797c88e96d9a2bd32d77dda3e18e21 to your computer and use it in GitHub Desktop.
Nested Properties
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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