如果实例的类型只是'实例',那么Python如何知道这些是foo类的实例?

时间:2014-12-08 16:18:51

标签: python object object-type

将对象放在列表中(在python中)就像将类对象放在ArrayList<object>中一样? 我试过这段代码

class foo():
    def __init__(self):
        self.name = "frank"
        self.id = 007


obj1 = foo()
obj2 = foo()

element_list = []
element_list.append(obj1)
element_list.append(obj2)

for element in element_list:
    print(type(element))
    print(element.name)

对象类型原来是<type 'instance'>。但随后对象正确打印了指定的变量。

python如何识别这些实例的类型?即使它正在获取实例对象,它如何映射该类?

2 个答案:

答案 0 :(得分:1)

type()对于旧式类的实例(不从object继承的Python 2类)无法正常工作。 Python会查看.__class__属性:

>>> class Foo:
...     def __init__(self):
...         self.name = 'frank'
...         self.id = 7
... 
>>> f = Foo()
>>> type(f)
<type 'instance'>
>>> f.__class__
<class __main__.Foo at 0x107b321f0>

对于新式类的实例(因此那些继承自object的类),type()只是直接返回__class__属性。

这不重要;所有你真正在做的就是查看直接存储在实例本身上的属性。这些存储在每个实例的__dict__属性中:

>>> f.__dict__
{'name': 'frank', 'id': 7}

方法查找(以及在类或其基础上定义的任何其他属性)确实需要Python查看类:

>>> f.__init__
<bound method Foo.__init__ of <__main__.Foo instance at 0x107b1d710>>
>>> f
<__main__.Foo instance at 0x107b1d710>

为此,此处使用了__class__属性。

答案 1 :(得分:0)

Python执行方法调用时不会查看您调用该方法的对象的类型。它只是检查对象(不是类)是否包含与方法名称匹配的属性,然后检查该属性是否可调用。

在Python中,您可以获取类X()的对象,其中X()不包含blah()的方法,并向该对象实例添加名为blah()的方法,调用该方法 - 即使类型不知道这种方法。

要看到这一点:

class C(object): pass

obj1 = C()
obj2 = C()

obj1.double = lambda x: x*2

现在,您可以调用obj1.double():

obj1.double("hello")
'hellohello'

但不是obj2.double():

obj2.double("hello")
AttributeError: 'C' object has no attribute 'double'