已知类的属性如何在python

时间:2016-03-29 23:18:39

标签: python

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)。有办法吗?

4 个答案:

答案 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"

这项技术显然无法正常运作。