2016-03-29 1 views
2
class person:  
    def __init__(self, name, gender): 
     self.name=name 
     self.gender=gender 

b=person('bob','male') 
b.name='bob' 
b.gender='male' 

私は文字列 'bob'を持っていますが、オブジェクトbを得るにはどうすればいいですか?クラスの属性を知っていますか?

お返事ありがとうございました。私はより明確にしましょう。ユニークな名前しかないと思ったら、私の目標はボブの性別を見つけることです(私は「ボブ」しか知りませんが、私はbを知らない)。そうする方法はありますか?

+0

あなたの目的は?これは、おそらくあなたが望むものを達成する最も簡単な方法ではありません。 – zondo

+0

'PersonFinder'クラスを作成できましたか?詳細情報が必要 – jeremy

+0

文字列を指定してオブジェクトを取得できるようにするには、辞書を使用して文字列をオブジェクトにマップするだけで済みます。 –

答えて

3

実際の世界のように、「bob」という名前のpeopleが複数ある可能性があります。

+0

編集する前でさえ、この例ではbobという名前の人が1人しかいなかったので、これは実際の答えではありません。 –

1

これは、あなたの人が誰であるかを知るための方法があることを前提としています。あなたが人のリストを持っていて、「ボブ」を探したいとしましょう。

a = person('anne', 'female') 
b = person('bob', 'male') 
c = person('cathy', 'female') 

people = [a, b, c] 

ここで、名前が「ボブ」かどうかを確認することができます。

maybe_bob = [pers for pers in people if pers.name == 'bob'] 

'bob'が存在する場合、リスト内の最初の項目を呼び出すことでオブジェクトにアクセスできます。

try: 
    bob = maybe_bob[0] 
except IndexError: 
    print "No one named 'bob'." 

もちろん、ウィム氏のように、あなたのリストに「ボブ」という名前の人が複数いると、これは壊れてしまいます。 test.pyであなたの例を使用して

import inspect 
import importlib 
import ast 

class FindAttr(ast.NodeVisitor): 
    def __init__(self, name): 
     self.name = name 
     self.b = None 

    def visit_Assign(self, node): 
     for t in node.targets: 
      if isinstance(t, ast.Attribute) and hasattr(node.value, "s"): 
       if node.value.s == self.name: 
        self.b = (getattr(mod,t.value.id)) 
        return 


mod = "test" 
mod = importlib.import_module(mod) 
p = ast.parse(inspect.getsource(mod)) 

f = FindAttr("bob") 
f.visit(p) 

:ボブ以来

1

あなたはASTでインスタンスを取得し、それとは性別を引き出すことができるユニークな

In [4]: mod = "test" 

In [5]: mod = importlib.import_module(mod) 

In [6]: p = ast.parse(inspect.getsource(mod)) 

In [7]: f = FindAttr("bob") 

In [8]: f.visit(p) 


In [9]: print(f.b) 
<test.person instance at 0x7f2a78e623f8> 
In [10]: print(f.b.gender) 
male 

In [11]: print(f.b.name) 
bob 
In [12]: print(f.b.__class__) 
test.person 
0

逆引き用dictましたおそらくあなたが望むものです:

class person: 
    people_database = {} 
    def __init__(self, name, gender): 
     person.people_database[name] = self 
        #add this instance to the database 
        #possibly overriding the previous entry with this name 
     self.name=name 
     self.gender=gender 

b=person('bob','male') 

print (person.people_database["bob"]) 
print (b) 
print(b is person.people_database["bob"]) 

b=person('bob','male') 
b.name = "susan" 

このテクニックは明らかに正しく動作しません。

関連する問題