4

我是 Python 的初学者,刚刚开始学习课程。我敢肯定这可能是非常基本的东西,但为什么这段代码:

class Television():
    def __init__(self):
        print('Welcome your TV.')
        self.volume = 10
        self.channel = 1
    def channel(self, channel):
        self.channel = input('Pick a channel: ')
        print('You are on channel ' + self.channel)
    def volume_up(self, amount):
        self.amount = ('Increase the volume by: ')
        self.volume += self.amount
        print('The volume is now ' + self.volume)
    def volume_down(self, amount):
        self.amount = ('Decrease the volume by: ')
        self.volume -= self.amount
        print('The volume is now ' + self.volume)
myTele = Television()
myTele.channel()
myTele.volume_up()
myTele.volume_down()

产生以下错误:

TypeError: 'int' object is not callable, Line 18

编辑:我将代码更改为:

class Television():
    def __init__(self, volume = 10, channel = 1):
        print('Welcome your TV.')
        self.volume = volume
        self.channel = channel
    def change(self, channel):
        self.channel = input('Pick a channel: ')
        print('You are on channel ' + self.channel)
    def volume_up(self, amount):
        self.amount = int(input('Increase the volume by: '))
        self.volume += self.amount
        print('The volume is now ' + str(self.volume))
    def volume_down(self, amount):
        self.amount = int(input('Decrease the volume by: '))
        self.volume -= self.amount
        print('The volume is now ' + str(self.volume))
myTele = Television()
myTele.change()
myTele.volume_up()
myTele.volume_down()

但它返回:

TypeError: change() missing 1 required positional argument: 'channel'

同样,这是来自刚开始上课的人,所以如果我做了一些明显错误的事情,请不要太苛刻。谢谢你。

4

3 回答 3

7

你在你的分配一个channel属性__init__

self.channel = 1

这会隐藏channel()类上的方法。重命名属性或方法。

实例上的属性胜过类上的属性(数据描述符除外;think propertys)。从类定义文档中:

类定义中定义的变量是类属性;它们由实例共享。实例属性可以在带有 的方法中设置self.name = value。类和实例属性都可以通过符号“<code>self.name”访问,并且当以这种方式访问​​时,实例属性会隐藏同名的类属性。

您的方法还需要一个您没有在示例中传递的参数,但我想您接下来会自己解决这个问题。

于 2013-03-27T20:00:10.687 回答
0

您有一个名为的方法channel和一个名为 的变量channel。变量,它是一个int,隐藏方法(窃取它的名称,以便您无法访问它)。重命名方法或变量,这将解决您的问题。

于 2013-03-27T20:01:07.917 回答
0

实际上,编辑后的代码暴露了 Martijn 已经指出的问题。您self.change()需要一个未在myTele.change(). 由于您没有在方法中使用参数,您应该定义change为:

def change(self):
    self.channel = input('Pick a channel: ')
    print('You are on channel ' + self.channel)

volume_upvolume_down实际上将字符串分配给 self.amount 而不是调用函数。您可能想将这些更改为

def volume_up(self, amount):
    self.amount = input('Increase the volume by: ')
    self.volume += self.amount
    print('The volume is now ' + self.volume)
def volume_down(self, amount):
    self.amount = input('Decrease the volume by: ')
    self.volume -= self.amount
    print('The volume is now ' + self.volume)

由于您self.amount每次都在使用它之前进行设置,因此您可以将其设置为方法 ( amount) 的局部变量。如果您将来计划xyz()使用self.amount不首先设置它的方法,则应确保self.amount将其设置__init__()为合理的值,以防xyz()在音量更改方法之前调用。

于 2013-03-27T20:37:12.010 回答