Confusing setter and getter? Python. str' object is not callable : I used to hear that have a functions such as **set_value()** and **get_value()** isn't pythonic way, and it always better to use property, setter and getter. I run the code bellow and recieve an error "**str' object is not callable**". When I search for this error- I find many examples of code, where class have attribute and method with the same name.  (like if I write  "**self.name**"   instead of   "**self.__name**" in the init statement) 
But I have write underscores before attribute - so it shouldn't happend. It look like when I try to call name.setter I actually call a property -and recieve back a string self.__name - and to this string - I then tryed to call something else. But why? In all examples of setter, they have the same name as property and it doesn't lead to problem. Why it throw an error here and how to fix it?

    class Dog():
        def __init__(self, name):
            self.__name = name
        
        @property
        def name(self):
            return self.__name
        
        @name.setter
        def name(self, name_in):
            self.__name = name_in
    
    dog = Dog("Barbos")       
    print(dog.name)                 #  this work
    dog.name("Juchka")              #  and this throw an error: 
                                    # 'str' object is not callable
