w3resource

Python Metaclass Tutorial: Validate Attributes as Integers

Python Metaprogramming: Exercise-2 with Solution

Validating Attributes with Metaclass:

Write a Python program to create a metaclass “ValidateAttrMeta” that ensures all attributes of a class are integers. Raise a TypeError if any attribute is not an integer.

Sample Solution:

Python Code :

# Define a metaclass that ensures all attributes are integers
class ValidateAttrMeta(type):
    # Override the __new__ method of the metaclass
    def __new__(cls, name, bases, dct):
        # Iterate over all attributes of the class
        for key, value in dct.items():
            # Check if the attribute is not a special method and is not an integer
            if not key.startswith('__') and not isinstance(value, int):
                # Raise a TypeError if the attribute is not an integer
                raise TypeError(f"Attribute {key} is not an integer")
        # Create the new class with validated attributes
        return super().__new__(cls, name, bases, dct)

# Create a class using the metaclass
class MyIntClass(metaclass=ValidateAttrMeta):
    # Define an integer attribute
    foo = 100
    # Define another integer attribute
    bar = 200
    # Define a non-integer attribute (uncomment to test the TypeError)
    # baz = 'not an integer'  # Uncommenting this should raise a TypeError

# Test the class
# Print the value of attribute foo
print(MyIntClass.foo)  # 100
# Print the value of attribute bar
print(MyIntClass.bar)  # 200

Output:

100
200

Explanation:

  • Metaclass Definition:
    • ValidateAttrMeta is a metaclass that overrides the 'new' method.
    • In the 'new' method, it iterates over all class attributes.
    • If an attribute is not a special method (doesn't start with __) and is not an integer, it raises a TypeError.
  • Class Creation:
    • MyIntClass uses 'ValidateAttrMeta' as its metaclass.
    • Attributes 'foo' and 'bar' are valid integers, so the class is created successfully.
    • Uncommenting the line defining 'baz' as a non-integer would raise a 'TypeError' during class creation.
  • Testing the Class:
    • The test code prints the values of the attributes 'foo' and 'bar'.

Python Code Editor :

Have another way to solve this solution? Contribute your code (and comments) through Disqus.

Previous: Python Metaclass Tutorial: Convert Attribute Names to Uppercase.
Next: Python Singleton Metaclass: Ensure One Instance

What is the difficulty level of this exercise?

Test your Programming skills with w3resource's quiz.



Become a Patron!

Follow us on Facebook and Twitter for latest update.

It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.

https://www.w3resource.com/python-exercises/metaprogramming/python-metaprogramming-exercise-2.php