2016-08-06 4 views
-1

私はこのコードを書いて、ユーザー入力を介してオブジェクトにアクセスしました。これは、地元の人々と作品(私はあまりにも辞書を作ることができます知っている)2つの入力を取得し、クラスのオブジェクトやメソッドにアクセスする方法は?

class Dragon: 

    def __init__(self, head, legs): 
     self.head = head 
     self.legs = legs 

    def sum(self): 
     return self.head + self.legs 


redfire = Dragon(2, 4) 
dic1 = {"redfire": redfire} 
input_object = input() 
print(dic1[input_object].sum()) 

が、私はクラスのメソッドと同じことをやろうとしているとき:

class Dragon: 

    def __init__(self, head, legs): 
     self.head = head 
     self.legs = legs 

    def sum(self): 
     return self.head + self.legs 

    def mul(self): 
     return self.head * self.legs 


redfire = Dragon(2, 4) 
dic1 = {"redfire": redfire, "sum": Dragon.sum(self), "mul": Dragon.mul} 
input_object = input() 
input_method = input() 
print(dic1[input_object].dic1[input_method]) 

私はすべての種類を取得しています

Traceback (most recent call last): 
    File "C:\Users\millw0rm\test.py", line 10, in <module> 
    dic1 = {"redfire": redfire, "sum": Dragon.sum(self), "mul": Dragon.mul} 
NameError: name 'self' is not defined 

辞書に登録されているメソッドの有効なキーを定義するにはどうすればよいですか?実際に

redfire = Dragon(2, 4) 
dic1 = {"redfire": redfire, "sum": Dragon.sum(self), "mul": Dragon.mul} 

を、あなたのクラスの関数定義で:あなたは間違いなくクラスメソッドを使用していない

+0

なぜ 'Dragon.sum'ですか?あなたはすでに 'redfire'インスタンスを作成しました。なぜそれをdictに追加しないのですか?その場合、 'self'は暗黙的に渡されます。または、 'Dragon 'を追加します。**まったく同じことをするばかげたやり方であるsum(redfire) '。 –

+0

'getattr(dic1 [input_object]、input_method)()'しますか? – jonrsharpe

+0

実際には、私は辞書のlook.itのそのメソッド部分で何をやっていたのか分かりません。いくつかのクラスがいくつかあると思います。オブジェクトをたくさん持っています。 object - そのオブジェクトの属性に関する指定を行うクラスのメソッド。この1つのように私はオブジェクトredfireを取得し、その後、私は入力からメソッドの合計を取得したいと思います。 – Millw0

答えて

0

def sum(self):、自己は、クラスのオブジェクトを参照してください。

あなたは、このようにそれを使用する必要があります。

# Create one dragon 
redfire = Dragon(2, 4) 
# Enter the dragon in the dict 
dic1 = {"redfire": redfire, "sum": redfire.sum(), "mul": redfire.mul()} 

したがって、あなたは基本的にDragon対象であるオブジェクトredfiresum()機能を使用しているredfire.sum()を使用しています。 print(dic1[input_object].dic1[input_method])、あなたは関数への参照を格納する必要があります:あなたの仕事の第二の部分について

sum_method = Dragon.sum 
sum_redfire = sum_method(redfire) 

はFinaly我々が得る:

redfire = Dragon(2, 4) 
sum_method = Dragon.sum 
dict1 = {"redfire": redfire, "sum": sum_method} 
input_object = input() 
input_method = input() 
print(dict1[input_method](dict1[input_object])) 
+0

Xavierは何を求めているのですか?もし私が1000個のオブジェクトを持っていれば、私はオブジェクトとメソッドの両方をユーザーの.imageから取得したい!辞書を大きくすることはできません。 あなたのコードを置き換えると、私はまだエラーが発生します AttributeError: 'Dragon'オブジェクトに 'dic1'という属性がありません – Millw0

+0

Millw0は私の答えに追加する部分を追加しました。 ) –

0

のメソッドを格納しない点はありません辞書:既にDragonクラスに格納されています。コメント内でjonrsharpeが言及しているように、組み込みのgetattr関数を使用してクラスインスタンスの属性を取得できます。あなたのsummulのようなメソッドだけでなく、単純なheadlegsの属性に適用されます。

コードの再構成版ですが、役に立つと思います。私は、クラスに__repr__メソッドを追加して、Dragonインスタンスを印刷するときに有用な情報を得るようにしました。

class Dragon: 
    def __init__(self, head, legs): 
     self.head = head 
     self.legs = legs 

    def sum(self): 
     return self.head + self.legs 

    def mul(self): 
     return self.head * self.legs 

    def __repr__(self): 
     return 'Dragon({}, {})'.format(self.head, self.legs) 

dragons = {} 
dragons["redfire"] = Dragon(2, 4) 
dragons["greenfire"] = Dragon(1, 2) 
print(dragons) 

name = input("name: ") 
method_name = input("method: ") 
d = dragons[name] 
method = getattr(d, method_name) 
print(d, method())  

テストもちろん

{'redfire': Dragon(2, 4), 'greenfire': Dragon(1, 2)} 
name: redfire 
method: sum 
Dragon(2, 4) 6 

、あなたはこのようなdragons辞書を作成することができます。

dragons = { 
    "redfire": Dragon(2, 4), 
    "greenfire": Dragon(1, 2), 
} 
GETATTRを言及するため
+0

thats正しい推測は最後の行でそのdを必要としません...あなたは私の変更されたコードを確認することができますz値のオブジェクトのクラス名を取得するとlolは地元の人々に助けのビットを尋ねました – Millw0

+0

@ Millw0確かに、私の最初のコードブロック内の行は 'print(dragons [name]、getattr(dragons [name]、method_name)())'に凝縮されますが、コードを読みやすくしたいと思いました。 –

0

本当にありがとうございましたeverbody特にjonrsharpとPM 2Ring () 関数 。以下のコードは私が探していたものです

class Dragon: 
    def __init__(self,head,tail): 
     self.head=head 
     self.tail=tail 
    def sum(self): 
     return (self.head + self.tail) 
class Snake: 
    def __init__(self,head,tail): 
     self.head=head 
     self.tail=tail 
    def sum(self): 
     return (self.head * self.tail) 
python=Snake(1,1) 
anakonda=Snake(3,5)  
redfire=Dragon(2,4) 
hellfly=Dragon(2,10) 
x=input() 
y=input() 
z=objectdic[x].__class__.__name__ 
print(getattr(locals()[z],y)(locals()[x])) 
+0

あなたが必要とする何か特別なことをしていない限り、 'locals()'を使うのは良い考えではありません。 'locals()'を使うと、コードを読むのが難しくなります。 –

関連する問題