Python - Property setting from list causes maximum recursion depth exceeded

后端 未结 1 1642
没有蜡笔的小新
没有蜡笔的小新 2020-12-03 17:31

I have the following class:

class vehicle(object):
    def __init__(self, name):
        self.name = name
        self.kinds_list = [\"tank\", \"car\", \"mot         


        
相关标签:
1条回答
  • 2020-12-03 17:46

    The reason you reached the maximum recursion depth is that inside your setter, you do self.kind = ..., which recursively calls the same setter. You should store the value as some private attribute, just rename self.kind to self._kind.

    class vehicle(object):
        def __init__(self, name):
            self.name = name
            self.kinds_list = ["tank", "car", "motorbike", "bike", "quad" ] 
    
        @property
        def kind(self):
            return self._kind
    
        @kind.setter
        def kind(self, x):
            if x in self.kinds_list:
                self._kind = x
            else:
                raise ValueError('{0} is an illegal kind of vehicle!'.format(y))
    

    This is not a real private attribute like in other languages, since nothing prevents you from accessing my_vehicle._kind. By convention in python, everything starting with an underscore is private and shouldn't normally be touched outside of the class. Or as they say: python is for consenting adults ;).

    I also slightly modified the error message in the setter.

    0 讨论(0)
提交回复
热议问题