Warning: Some posts on this platform may contain adult material intended for mature audiences only. Viewer discretion is advised. By clicking ‘Continue’, you confirm that you are 18 years or older and consent to viewing explicit content.
This is fun to play around and basically what Python does under the hood to implement classes. In Python2 it was even more obvious that classes are just fancy wrappers around a dict called, unsurprisingly, __dict__.
Note: this won’t work in Python3 because the class.__dict__ becomes immutable at some point after declaring it, but the attribute name resolution stays the same. And it gets more interesting once you throw inheritance into the mix.
This is fun to play around and basically what Python does under the hood to implement classes. In Python2 it was even more obvious that classes are just fancy wrappers around a dict called, unsurprisingly,
__dict__
.class Foo: def __init__(self): self.__dict__["instance_method"] = lambda: "instance_method" self.__dict__["shadowed_class_method"] = lambda: "shadowed_class_method_from_instance" Foo.__dict__["class_method"] = lambda cls: "class_method" Foo.__dict__["shadowed_class_method"] = lambda cls: "shadowed_class_method_from_class" f = Foo() f.__dict__["dynamic_instance_method"] = lambda: "dynamic_instance_method" print f.instance_method() print f.dynamic_instance_method() print f.class_method() print f.shadowed_class_method() OUTPUT: instance_method dynamic_instance_method class_method shadowed_class_method_from_instance
Note: this won’t work in Python3 because the
class.__dict__
becomes immutable at some point after declaring it, but the attribute name resolution stays the same. And it gets more interesting once you throw inheritance into the mix.