2017-06-01 16 views
3

私はPythonを学んでおり、現在はクラスで作業しています。私はそれを学ぶのを助けるために基本的なゲームを作ろうとしており、そこから方法 を呼び出すことで奇妙な問題を抱えています。私はmain.pyファイルを持っていて、そのクラスからのインスタンスをCharacter.pyファイルに作成しています。Pythonクラスからメソッドを呼び出せないのはなぜですか?

これはCharacter.pyファイルです:

from Character import * 

player = Character("James") 
print(player.getName()) 

私は問題が何であるかわからない:これはmain.pyファイルです

class Character: 
    name="" 

    def __init__(Name): 
     name=Name 

    def getName(): 
     return name 

Traceback (most recent call last): 
    File "C:\Users\dstei\Documents\Python\It 102\Final Project\Main.py", line 
12, in <module> 
    print(player.getName()) 
TypeError: getName() takes 0 positional arguments but 1 was given 

それは私が1つの位置引数を与えているが、私はいずれかを与えたところ、私が表示されていないと言っている:これは私が取得エラーです。私は何が欠けていますか?

答えて

8

インスタンスメソッドを持つクラスがあるので、現在のインスタンスを参照するために、最初の引数(慣習的にはself)を含める必要があります。 thisよう

class Character: 
    def __init__(self, Name): #self is the current instance 
     self.name=Name #set the variable on the instance so that every instance of Character has a name 

    def getName(self): 
     return self.name #refer to the name with the instance 

Pythonは内部的にすべてのクラスメソッドの最初の引数としてクラスの新しいインスタンスを渡し、:また、self、現在のインスタンスを使用して、インスタンス変数として変数を設定してくださいJavaなどの言語でこのエラーは、Pythonがインスタンスを最初の引数として内部的に渡しますが、getterが引数を取るように定義されていないという事実に起因します。

上記のコードでは、インスタンスに対してメソッドを呼び出すと、そのインスタンスが最初の引数として内部的に渡され、引数としてとnameが正しく設定されているため、Pythonはエラーになりませんインスタンス。


注:

def get_name(self): 
    #... 

またゲッターとセッターではない理由を説明しているchepner's answerを参照してください:あなたのゲッターは、このような大会を見てでなければならないので、慣例により、Pythonは、キャメルケースを使用しますが、アンダースコアはありません通常は必要です。

print(player.name) #get 
player.name = "Jeff" #set 
+1

などのsetNameとsetメソッドを作るために、それはこのことだろう専門家は、良い説明を語られた、共有、プラスワン –

+0

ためのおかげで、ありがとう! def setName(newName): self.name = newName –

+0

@D.Steiすべてのインスタンスメソッドは、最初の引数としてselfを含める必要があります: 'def set_name(self、new_name):self.name = new_name' – Li357

0

パラメータselfを追加することを忘れてしまいました。 selfはオブジェクト自体へのオブジェクト参照であるため、同じです。 Pythonのメソッドは、オブジェクト自体のコンテキストでは呼び出されません。 Pythonでの自己は、カスタムオブジェクトモデルに対処するために使用され得るか、またはこのパラメータが必要な理由、とても良い答えがここにあります

class Character: 

    def __init__(self,name): 
     self.name=name 

    def getName(self): 
     return self.name 

は表示するには:

他の人が述べたようにWhat is the purpose of self?

4

、でもインスタンスメソッドは、通常はselfという名前の余分な引数を使用して宣言する必要があります(ただし、必須ではありません)。

class Character: 
    def __init__(self, name): 
     self.name = name 

    def get_name(self): 
     return name 

しかし、Pythonは(例えば、パブリックまたはプライベートなど)施行の可視性のいずれかの種類を持っていないので、このような些細なゲッターとセッターは、通常は書かれていません。あなたが "許可され​​た"属性についての文書は、十分な保護とみなされます。

class Character: 
    def __init__(self, name): 
     self.name = name 

c = Character("Bob") 
print(c.name) # instead of c.get_name() 
c.name = "Charlie" # instead of c.set_name("Charlie") 
+0

ああ、私はこれについて言及しなかった。 +1 – Li357

+0

よく知っておきたいことですが、ありがとうございます。これはリストでも機能しますか? –