将对象放在列表中(在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如何识别这些实例的类型?即使它正在获取实例对象,它如何映射该类?
答案 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'