2017-12-09 6 views
0

私は関数に渡した変数の名前を取得しようとします。クラス関数の引数/パラメータから変数名を取得

class A(): 
    def __init__(self): 
    self.a = 1 

class B(): 
    def __init__(self): 
    self.b = A() 
    self.c = A() 

    def doSomething(self, hello): 
    print(hello) 

B().doSomething(B().b) 
<__main__.A object at 0x7f67571a3d68> 

私が望むのは、関数B()。doSomething()で変数がbであることを識別できることです。これは可能ですか? 1つの制約は、関数B()。doSomething()のインスタンス変数だけが渡されることです。ピーウィーで例えば

https://github.com/coleifer/peewee)、PythonでMySQLのORM、彼らのようなフィルタリングのための式を作成する:

B.select().where(B.b == True) 

そしてどういうわけか、彼らはBが渡されていること、識別することができます。それ以外の場合は、クエリを正しく構築できないためです。

私は彼らがクラスで静的変数を使用していることを知っています、これはおそらくトリックですか?

ありがとうございます! :)あなたB().doSomething(B().b)例で行く

+0

質問doesnの意味をなさない。 'hello == 'b''かどうかを調べようとしていますか?あるいは、実際の変数名を決定しようとしていますか?あるいは 'self.b == hello'と判断しようとしていますか? – MCBama

+0

私は実際の変数名を取得しようとします。それはあまりにも、私はBを渡すことができます。それから私はcが渡されたことを知ります。 – EDNA

答えて

0

は、私はあなたが変数helloclass Bオブジェクトで宣言された変数bと等価であるかどうかを判断しようとしていると仮定するつもりです呼び出します。

この場合、selfの参照に電話する必要があります。 selfは、作業中のオブジェクトのインスタンスを参照し、クラス内で定義されたすべてのメソッドは、メソッド属性としてオブジェクトのselfを自動的に参照します。

したがって、オブジェクトb変数がhelloパラメータに等しいかどうかを判断するためには、すべてを行う必要があるBのインスタンス変数if self.b == hello: #do code

+0

'self.b == hello'を比較すると、' B()。doSomething(B()。c) 'を渡すと間違った変数名が得られる可能性があります。 'B().b'と 'B()。c'は同じクラスを持っているからです。 – EDNA

+0

いいえ、 'B().b!= B().c'は同じクラスかもしれないが、異なるインスタンスなのでです。したがって、それらは等価ではなく、技術的に 'if ... else'ステートメントを実行して、どちらが渡されたかを判断できます。 私は本当になぜこれを行う必要があるか分かりません。 – MCBama

+0

データベースへのクエリがある場合、ユーザーがB()。bやB()などのBを渡したかどうかを知る必要があります。b家の価格とB() 。c家主の電話番号を保存します。これを区別できない場合は、データベースの式を正しく構築できません。コードスニペットを教えてもらえますか?私は 'if self.b == hello:'を試みましたが、動作しません。引数が代入によって渡された可能性がありますか? [link](https://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference) – EDNA

0

B().bではありません。むしろ、それはAのインスタンス変数です。 Bのコンストラクタでは、Bのインスタンスになるように、がBまたはself.aのインスタンスになっている可能性があります。これがあなたの一般的な考えであれば、ブーリアンオーバーロードメソッドを実装して、2つを区別することができます。あなたのコードの場合、それはdoSomethingに渡された属性が属するものをクラスチェックするために、第三のクラス、Cを作成するのが最善かもしれ:

class A(): 
    def __init__(self): 
    self.a = 1 
    def __bool__(self): 
     return True 

class B(): 
    def __init__(self): 
    self.b = 1 
    def __bool__(self): 
    return False 


class C(): 
    def __init__(self): 
     self.a = A() 
     self.b = B() 
    def doSomething(self, hello): 
     if not hello: 
      print("instance of a got passed") 
     else: 
      print("instance of b got passed") 

C().doSomething(C().b) 

は出力:

instance of b got passed 
+0

残念ながら、例えば私がself.a = IntegerFieldのデータベースを持っていない場合)とself.b = IntegerField()、私は同じクラスを2回使用します。 – EDNA

関連する問題