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?
非常感谢所有的答案和帮助。让我更清楚一点。如果我认为只能有唯一的名字,我的目标是找到鲍勃的性别(我只知道' bob'但我不知道b)。有办法吗?
答案 0 :(得分:3)
你不能,因为 - 就像在现实世界中一样 - 可以有多个名为'bob'的people
。
答案 1 :(得分:1)
这假设你有办法知道你的所有人是谁。假设你有一个人名单,你想找到'bob'。
a = person('anne', 'female')
b = person('bob', 'male')
c = person('cathy', 'female')
people = [a, b, c]
现在,您可以检查每个人,看看他们的名字是否是“bob”。
maybe_bob = [pers for pers in people if pers.name == 'bob']
如果'bob'存在,我们可以通过调用列表中的第一项来访问他的对象。
try:
bob = maybe_bob[0]
except IndexError:
print "No one named 'bob'."
当然,就像wim所说,如果列表中有多个名为“bob”的人,这将会崩溃。
答案 2 :(得分:1)
由于bob是唯一的,你可以使用ast获取实例并从中拉出性别:
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)
在test.py中使用您的示例:
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
答案 3 :(得分: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"
这项技术显然无法正常运作。