Python设置器TypeError:'int'对象不可调用

3
我正在尝试为我的私有 self.__food 变量创建一个 setter。基本上,我希望子类 Tiger 更改这个私有变量,并限制其值不超过 100。但是,我收到了一个错误:TypeError:'int' object is not callable。我错在哪里?如何解决?谢谢。
class Animal:
    def __init__(self,foodamount=10, location = 'Australia'):
        self.__food = foodamount
        self.location = location

    @property
    def foodamt(self):
        return self.__food

    @foodamt.setter
    def foodsetter(self, foodamount):
        if self.__food >100:
            self.__food = 100
        else: self.__food = foodamount


class Tiger(Animal):
    def __init__(self,colour = 'orange'):
        super().__init__(location ='programming and gaming')
        self.colour = colour


an = Tiger()
an.colour='red'
print(an.colour)
ansetfood = an.foodsetter(1000)
print(ansetfood)

这不是定义setter的正确方式。请使用与getter\property相同的方法名称(属性名称)(foomat而不是foodsetter)。请参阅http://docs.python.org/library/functions.html?highlight=property#property。 - Aviad
1个回答

5
我看到了一些问题。
  • 当使用属性时,您不需要手动调用setter方法的名称,比如an.foodsetter(1000)。您应该使用属性赋值语法,例如an.foodamt = 1000。这是属性的全部意义:具有透明的属性语法,同时仍具有函数行为。
  • 您应该将foodamount与100进行比较,而不是self.__food
  • 属性的getter和setter应该具有相同的名称。
class Animal:
    def __init__(self,foodamount=10, location = 'Australia'):
        self.__food = foodamount
        self.location = location

    @property
    def foodamt(self):
        return self.__food

    @foodamt.setter
    def foodamt(self, foodamount):
        if foodamount >100:
            self.__food = 100
        else: self.__food = foodamount


class Tiger(Animal):
    def __init__(self,colour = 'orange'):
        super().__init__(location ='programming and gaming')
        self.colour = colour


an = Animal()
an.colour='red'
print(an.colour)
an.foodamt = 1000
print(an.foodamt)

结果:

red
100

你不需要将 self 传递给 super - Moses Koledoye
奇怪的是,在我回答问题时,super 看起来需要 self,但现在它不需要了。好的,已经编辑过了。谢谢 :-) - Kevin
非常感谢大家。你们能否推荐一些网站/教程,让我更好地理解面向对象编程的应用场景。对我来说,这个概念还有点抽象。 - Muten_Roshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接