You are viewing a single thread.
View all comments
1 point

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.

permalink
report
reply

Python

!python@programming.dev

Create post

Welcome to the Python community on the programming.dev Lemmy instance!

📅 Events
October 2023
November 2023
Past

July 2023

August 2023

September 2023

🐍 Python project:
💓 Python Community:
✨ Python Ecosystem:
🌌 Fediverse
Communities
Projects
  • Pythörhead: a Python library for interacting with Lemmy
  • Plemmy: a Python package for accessing the Lemmy API
  • pylemmy pylemmy enables simple access to Lemmy’s API with Python
  • mastodon.py, a Python wrapper for the Mastodon API
Feeds

Community stats

  • 1

    Monthly active users

  • 145

    Posts

  • 125

    Comments