Python反射和可调用对象

时间:2010-11-05 07:32:04

标签: python oop class reflection

我有两个问题。

>>> 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将它变成了一种类型。

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

4 个答案:

答案 0 :(得分:5)

类是高级对象,因此您可以像这样简单地传递它们:

def createMyClass ( myClass ):
    obj = myClass()
    return obj

class A ( object ):
    pass

>>> x = createMyClass( A )
>>> type( x )
<class '__main__.A'>

答案 1 :(得分:1)

只是另一个例子:

def InstanceFactory(classname):
   cls = globals()[classname]
   return cls() 

class A(object):
   def start(self):
       print "a.start"

class B(object):
   def start(self):
        print "b.start"

InstanceFactory("A").start()
InstanceFactory("B").start()

如果该类属于另一个模块:

def InstanceFactory(modulename, classname):
    if '.' in modulename:
        raise ValueError, "can't handle dotted modules yet"
    mod = __import__(modulename)
    cls = getattr(mod, classname]
    return cls() 

答案 2 :(得分:1)

  

如何创建对象'Two'?   constr()或c()都不起作用;而且它   似乎申请把它变成了一个   类型。

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

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

apply(已弃用:请参阅@ pyfunc的答案)当然不会将类Two转换为类型:它已经是一个。

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

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

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

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

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

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

关于你的最后一个问题,

  

通过课程时会发生什么   而且是一个方法的实例?

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

答案 3 :(得分:0)

我很困惑。自2.3以来不适用()已弃用

我们不再需要这个了。

apply(f, args, kwds)  -->  f(*args, **kwds)

其他人在现代使用中被移动/被视为弃用:

  1. 缓冲液()
  2. 裹胁()
  3. 和实习生()
  4. 只需使用:Classname()创建一个对象。