Python Metaclass Tutorial: Convert Attribute Names to Uppercase
Basic Metaclass:
Write a Python program to create a metaclass “UpperAttrMeta” that converts all attribute names of a class to uppercase.
Sample Solution:
Python Code :
# Define a metaclass that converts all attribute names to uppercase
class UpperAttrMeta(type):
    def __new__(cls, name, bases, dct):
        # Create a new dictionary to store uppercase attributes
        uppercase_attr = {}
        for name, value in dct.items():
            if not name.startswith('__'):
                # Convert attribute name to uppercase
                uppercase_attr[name.upper()] = value
            else:
                # Preserve special methods as they are
                uppercase_attr[name] = value
        # Create the new class with modified attributes
        return super().__new__(cls, name, bases, uppercase_attr)
# Create a class using the metaclass
class MyClass(metaclass=UpperAttrMeta):
    foo = 'bar'
    baz = 'qux'
# Test the class
print(hasattr(MyClass, 'foo'))  # False, because attribute names are uppercase
print(hasattr(MyClass, 'FOO'))  # True, because 'foo' is converted to 'FOO'
print(MyClass.FOO)  # 'bar', accessing the uppercase attribute
Output:
False True bar
Explanation:
- Metaclass Definition:
- UpperAttrMeta is a metaclass that overrides the 'new' method.
- It creates a new dictionary 'uppercase_attr' where all attribute names (except special methods starting with __) are converted to uppercase.
- Class Creation:
- MyClass is defined to use 'UpperAttrMeta' as its metaclass.
- Attributes 'foo' and 'baz' in 'MyClass' are automatically converted to 'FOO' and 'BAZ'.
- Testing the Class:
- The test checks if 'foo' exists in 'MyClass' (it does not, because it was converted to uppercase).
- It then checks if 'FOO' exists (it does) and prints its value ('bar').
Python Code Editor :
Have another way to solve this solution? Contribute your code (and comments) through Disqus.
Previous: Python Metaprogramming Exercises Home.
Next: Python Metaclass Tutorial: Validate Attributes as Integers
What is the difficulty level of this exercise?
Test your Programming skills with w3resource's quiz.
