'I'm trying to set up a class with methods from the same property that can be called by the same name using @property instead of the function property

I'm trying to create a class with @property, but i keep getting an recursion error and don't know why.

class residente:
    def __init__(self, name, age, program):
        self.name = name
        self.age = age
        self.program = program
        print(self.name, "is a student living in City", self.age, "years old", "and studying a", self.program, ".")
    @property
    def name(self):
        return self.name
    @name.setter
    def name(self, name):
        self.name = name
    @name.deleter
    def name(self):
        del self.name
        
    @property
    def age(self):
        return self.age
    @age.setter
    def age(self, age):
        self.age = age   
    @age.deleter
    def age(self):
        del self.age
        
    @property
    def program(self):
        return self.program
    @program.setter
    def program(self, program):
        self.program = program
    @program.deleter
    def program(self):
        del self.program

        
Bernardo = residente("Bernardo", "23", "Medicine in English")

I keep getting the following error

Output:



Solution 1:[1]

Reusing name, age, and program variables result in the setters calling themselves.

class residents:
    # self.name = name
    # self.age = age
    # self.program = program
    # 
    # results in the setter calling itself
    # 
    # Changed to 
    #         self._name = name
    #         self._age = age
    #         self._program = program

    def __init__(self, name, age, program):
        self._name = name
        self._age = age
        self._program = program
        print(self.name, "is a student living in City", self.age, "years old",
              "and studying a", self.program, ".")


    @property
    def name(self):
        return self._name


    @name.setter
    def name(self, name):
        self.name = _name


    @name.deleter
    def name(self):
        del self._name


    @property
    def age(self):
        return self._age


    @age.setter
    def age(self, age):
        self.age = _age


    @age.deleter
    def age(self):
        del self._age


    @property
    def program(self):
        return self._program


    @program.setter
    def program(self, program):
        self.program = program


    @program.deleter
    def program(self):
        del self.program

Bernardo = residente("Bernardo", "23", "Medicine in English")

Result:

Bernardo is a student living in City 23 years old and studying a Medicine in English .

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1