Search code examples
pythonclassvariable-assignment

Instance method to return name of attribute to which it assigns a value


Any way to return name of instance attribute in method it calls on assignment?

class MyClass:
    def __init__(self):
        self.not_relevant = 0
        self.name_to_return = self.assign_own_name()
    
    def assign_own_name(self):
        return "name_to_return"  # to replace 

assert MyClass().name_to_return == 'name_to_return'

Use case: multiple attribute are initialized and value supplying instance method operates on basis of attribute name.

    def __init__(self):
        self.name_1 = do('name_1')
        ...
        self.name_n = do('name_n')
    
    def do(self, x):
        return x  # e.g. db query

Solution

  • If you override the setattr dunder method, you can do it like this:

    class Class:
        def __init__(self):
            pass
        def __setattr__(self, name, value):
            super(Class, self).__setattr__(name, value)
            return name
    
    _class = Class()
    
    print(_class.__setattr__('foo', 'bar'))
    print(_class.foo)
    

    Output:

    foo
    bar
    

    Whilst...

    _class.foo = 'bar'
    

    ...would still be syntactically correct you can't get the return value from such an assignment. If assignment expressions (walrus operator) worked with attributes then it would be easy but that's not allowed