str不可调用或int不可调用

2024-09-27 20:17:48 发布

您现在位置:Python中文网/ 问答频道 /正文

[已解决]我用Python编写了一个使用类的程序,但是它一直在说'str' object is not callable,如果我尝试注释第7、8和16行,那么它会说 'int' object is not callable。你知道吗

class Lambo:
    def __init__(self, color, model_number, average, milage):
        self.color = color
        self.model_number = model_number
        self.average = average
        self.milage = milage
    def color(self):
        print("Lamborghini color is " + self.color)
    def model_number(self):
        print("Lamborghini model number is " + str(self.model_number))
    def average(self):
        print("Lamborghini average is " + str(self.average))
    def milage(self):
        print("Lamborghini milage is " + str(self.milage))
lambor = Lambo("Red", 2016, 20, 8)
lambor.color()
lambor.model_number()
lambor.average()
lambor.milage()

预期产量:

Lamborghini color is Red
Lamborghini model_number is 2016
Lamborghini average is 20
Lamborghini milage is 8

我也在使用PyCharm社区版4.5.4


Tags: selfnumbermodelobjectisdefnotcolor
3条回答

使用color(etc)作为变量名(字符串)和方法名。在python中不能这样做。你知道吗

错误str is not callable意味着在字符串变量后面加括号(因此试图像函数一样“调用”它)。每当你看到这个,在编程逻辑中就有一个错误。你知道吗

您的实例具有以下属性:

self.color = color
self.model_number = model_number
self.average = average
self.milage = milage

那些掩码您定义的方法;方法只是更多的属性,但是Python首先查看实例,然后才查看类以查找属性:

>>> lambor = Lambo("Red", 2016, 20, 8)
>>> lambor.color
'Red'

您没有调用Lambo.color()方法,而是试图调用字符串'Red'。重命名在__init__中设置的属性,或者重命名方法。你知道吗

可以对每个名称使用一个前导下划线来删除冲突,并记录该属性仅在类内部使用:

class Lambo:
    def __init__(self, color, model_number, average, milage):
        self._color = color
        self._model_number = model_number
        self._average = average
        self._milage = milage
    def color(self):
        print("Lamborghini color is " + self._color)
    def model_number(self):
        print("Lamborghini model number is " + str(self._model_number))
    def average(self):
        print("Lamborghini average is " + str(self._average))
    def milage(self):
        print("Lamborghini milage is " + str(self._milage))

或者,重命名方法来说明它在做什么;在它们前面加上print_

class Lambo:
    def __init__(self, color, model_number, average, milage):
        self.color = color
        self.model_number = model_number
        self.average = average
        self.milage = milage
    def print_color(self):
        print("Lamborghini color is " + self.color)
    def print_model_number(self):
        print("Lamborghini model number is " + str(self.model_number))
    def print_average(self):
        print("Lamborghini average is " + str(self.average))
    def print_milage(self):
        print("Lamborghini milage is " + str(self.milage))

lambor = Lambo("Red", 2016, 20, 8)
lambor.print_color()
lambor.print_model_number()
lambor.print_average()
lambor.print_milage()

一般来说,不应该让类负责这样的输出。通常给类一个__str__方法,该方法可以生成一个用户友好的字符串,然后在实例上打印调用str(),或者直接将其发送到print()函数:

class Lambo:
    def __init__(self, color, model_number, average, milage):
        self.color = color
        self.model_number = model_number
        self.average = average
        self.milage = milage
    def __str__(self):
        lines = [
            "Lamborghini color is " + self.color,
            "Lamborghini model number is " + str(self.model_number),
            "Lamborghini average is " + str(self.average),               
            "Lamborghini milage is " + str(self.milage)
        ]
        return '\n'.join(lines)

lambor = Lambo("Red", 2016, 20, 8)
print(lambor)

方法和属性具有相同的名称。你知道吗

相关问题 更多 >

    热门问题