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

You assign a channel attribute in your __init__:

self.channel = 1

This shadows the channel() method on the class. Rename the attribute or the method.

Attributes on the instance trump those on the class (except for data descriptors; think propertys). From the Class definitions documentation:

Variables defined in the class definition are class attributes; they are shared by instances. Instance attributes can be set in a method with self.name = value. Both class and instance attributes are accessible through the notation “<code>self.name”, and an instance attribute hides a class attribute with the same name when accessed in this way.

Your methods also expect a parameter that you are not passing in in your example, but I'm figuring you'll solve that yourself next.

于 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_up関数を呼び出す代わりに、volume_down実際に文字列を self.mount に割り当てます。あなたはおそらくそれらをに変更したいでしょう

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.amountself.amount__init__()xyz()

于 2013-03-27T20:37:12.010 に答える