2016-04-26 15 views
0

クラスインスタンスの属性名前空間をメソッドにインポートする方法はありますか?メソッドへのインスタンス名前空間のインポート

また、インスタンスの属性名前空間に直接出力することはできますか?

例えば、コードのこの単純なブロックを考えてみます。nameが認識されないため

予想通り
class Name(): 
    def __init__(self,name='Joe'): 
     self.name = name 

    def mangle_name(self): 
     # Magical python command like 'import self' goes here (I guess) 
     self.name = name + '123' # As expected, error here as 'name' is not defined 

a_name = Name() 
a_name.mangle_name() 
print(a_name.name) 

は、このコードブロックは失敗します。私が達成したいのは、メソッドmangle_nameがの属性名前空間を検索してnameを探し出す(したがって、例では'Joe'を見つけることです)。

>>> Joe123 

私はこれはおそらく悪い習慣であることを理解し、しかし、いくつかの状況で、それはなるだろう。そこにはエラーがないであろうと、出力がされるようselfの属性の名前空間をインポートするようないくつかのコマンドは、そこにありますコード全体の中で何かを参照するヒープがなくても、コードはかなり明確になります。self.これが「恐ろしい、そして決してすべきではない」練習であれば、理由を説明してください。質問の後半部分に関して

、私は何をしたいです:

このコードは出力を返します
class Name(): 
    def __init__(self,name='Joe'): 
     self.name = name 

    def mangle_name(self): 
     # Magical python command like 'import self' goes here (I guess) 
     name = name + '123' # This line is different 

a_name = Name() 
a_name.mangle_name() 
print(a_name.name) 

>>> Joe123 

モジュールはない返すimport selfコマンドをしようエラーが見つかりました。

私はPython 3.5を使用しているため、Python 3.5互換の答えが好まれます。

編集:分かりやすくするために。

答えて

0

だからあなたmangle_name機能では、エラーを取得しているあなたが名前を定義していないbecuase変数

self.name = name + '123' 

はマーティン・リア@

self.name = self.name + '123' 

か何か似

+0

はいわかりました。私の質問は、例の行が有効なコードと見なされるように、インスタンスの名前空間をインポートすることです。 – Charlie

+0

あなたは自己をインポートする必要はありません。コードを変更すると、コードは正常に実行されます。あなたのクラス関数はすでにクラス属性にアクセスできます。 –

+0

この質問は、インスタンスを可能な限り単純にする方法ではなく、インスタンスの属性名前空間をインポートする方法についての質問です。場合によっては、コード全体を参照するヒープがなくてもコードをより明確にすることができます。 – Charlie

2

する必要がありますあなたの質問の第2部分に正しく答えました。

第1に、インスタンスの名前空間をメソッドスコープに「インポート」できるようにする言語機能はありません。自己に属性ルックアップを実行する以外の方法はありません。

あなたはおそらくあなたが望むような何かを得るためにexecまたはevalとインスタンスの__ dict __を乱用ことができますが、手動メソッドの最初にメソッドのスコープにインスタンスの名前空間をダンプして、インスタンスの__dict __を更新する必要があると思います最後に。

これを行うことはできますが、避けるべきです。ソースコードは主に人間間のコミュニケーション手段であり、あなたのコードが読者の期待に反して理解して読むことが難しくなり、この時間のコストが入力するコストよりも重くなります自己はインスタンス変数名の前にあります。 code as if the future maintainers are psychopaths who know where you liveがここに適用されるべき原則。

最後に、自己と入力しなければならないという刺激が、あなたのデザインについて何かを伝えていると考えてください。おそらくself.a + self.b + self.c + self.d + self.e + self.f + self.g + self.h + ....のようなものを入力しなければならないということは、抽象化がないことを示しています。この場合はおそらくコレクションです。sum(self.foos)と入力するだけでクラスを設計する必要があります。