Python反射和可调用对象

我有两个问题.

>>> class One(object):
...     pass
... 
>>> class Two(object):
...     pass
... 
>>> def digest(constr):
...     c = apply(constr)
...     print c.__class__.__name__
...     print constr.__class__.__name__
... 
>>> digest(Two)
Two
type

如何创建对象’Two’? constr()或c()都不起作用;似乎apply将它变成了一种类型.

将类和实例传递给方法时会发生什么?

最佳答案

How would one create object ‘Two’?
Neither constr() or c() work; and it
seems that apply turns it into a
type.

以上评论是针对此代码做出的:

>>> def digest(constr):
...     c = apply(constr)
...     print c.__class__.__name__
...     print constr.__class__.__name__

apply(不赞成:请参阅@ pyfunc的答案)肯定不会将第二类变成一个类型:它已经是一个.

>>> class Two(object): pass
... 
>>> type(Two)
<type 'type'>

类是第一类对象:它们是类型的实例.如果你看下一个例子,这是有道理的.

>>> two = Two()
>>> type(two)
<class '__main__.Two'>

您可以看到一个类非常清楚地作为一个类型运行,因为它可以从类型返回.这是另一个例子.

>>> Three = type('Three', (Two, ), {'foo': 'bar'})
>>> type(Three)
<type 'type'>
>>> three = Three()
>>> type(three)
<class '__main__.Three'>

您可以看到该类型是可以实例化的类.它的构造函数有三个参数:类的名称,基类的元组和包含类属性的字典.它返回一个新类型aka类.

至于你的最后一个问题,

What happens when you pass a class
rather and an instance into a method?

你必须更加具体.类只是类型的实例,因此是第一类对象.询问如果我将一个类传递给一个方法会发生什么,就像问我将一个整数传递给一个方法会发生什么:它完全取决于该方法的期望.

点赞