https://blog.stackademic.com/demystifying-pythons-descriptor-protocol-the-magic-behind-properties-and-methods-052d63ac0869