WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Python · Expert · question 66 of 100

How do you implement advanced metaprogramming techniques in Python, such as creating custom metaclasses and decorators?

📕 Buy this interview preparation book: 100 Python questions & answers — PDF + EPUB for $5

Metaprogramming in Python is the concept of writing programs that manipulate other programs or even themselves. This can be done using various tools and techniques in Python, such as metaclasses and decorators. In this answer, we will discuss how to implement advanced metaprogramming techniques in Python.

Custom Metaclasses

A metaclass is a class that creates other classes. In Python, every class is an instance of a metaclass, which is by default the type metaclass. However, we can create custom metaclasses to customize the behavior of classes.

To create a custom metaclass, we need to define a class that inherits from type. Here is an example of a simple metaclass that adds a greeting attribute to every class it creates:

    class GreetingMetaclass(type):
        def __new__(cls, name, bases, attrs):
            attrs['greeting'] = 'Hello'
            return super().__new__(cls, name, bases, attrs)

In this example, the __new__ method is called when a new class is created using this metaclass. It adds a greeting attribute to the class with the value ’Hello’. The super() function is used to call the parent class’s __new__ method to create the new class.

To use this metaclass, we simply specify it as the metaclass of the class:

    class MyClass(metaclass=GreetingMetaclass):
        pass
    
    print(MyClass.greeting) # Output: Hello

In this example, the MyClass class is created using the GreetingMetaclass metaclass. As a result, it has a greeting attribute with the value ’Hello’.

Custom metaclasses can be used to implement many advanced features in Python, such as enforcing coding standards, automatically generating code, and more.

Decorators

Decorators are a powerful tool for modifying the behavior of functions and classes in Python. They are simply functions that take a function or class as an argument and return a modified version of it. Here is an example of a simple decorator that adds a log message before and after a function call:

    def log(func):
        def wrapper(*args, **kwargs):
            print(f"Calling function {func.__name__}")
            result = func(*args, **kwargs)
            print(f"Finished function {func.__name__}")
            return result
        return wrapper

In this example, the log function is a decorator that takes a function as an argument and returns a new function that adds log messages before and after the original function call.

To use this decorator, we simply apply it to a function using the @ syntax:

    @log
    def add(x, y):
        return x + y
    
    print(add(1, 2)) # Output: Calling function addnFinished function addn3

In this example, the add function is decorated with the log decorator. When the add function is called, it will output log messages before and after the function call.

Decorators can be used to implement many advanced features in Python, such as caching, memoization, input validation, and more.

In conclusion, metaprogramming and decorators are powerful techniques that can be used to implement advanced features in Python. By using these techniques, we can write more efficient, maintainable, and extensible code.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Python interview — then scores it.
📞 Practice Python — free 15 min
📕 Buy this interview preparation book: 100 Python questions & answers — PDF + EPUB for $5

All 100 Python questions · All topics