Python反射和可调用对象

Python反射和可调用对象,python,oop,class,reflection,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__ ..

我有一个由两部分组成的问题

>>> 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
一个如何创建对象“二”?constr()或c()都不起作用;看来apply把它变成了一种类型


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

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

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

class A ( object ):
    pass

>>> x = createMyClass( A )
>>> type( x )
<class '__main__.A'>
def createMyClass(myClass):
obj=myClass()
返回obj
A类(对象):
通过
>>>x=createMyClass(A)
>>>类型(x)

不过我还是很困惑。自2.3版以来,未弃用apply()

我们不再需要这个了

apply(f, args, kwds)  -->  f(*args, **kwds)
在现代用法中,其他已被移动/视为弃用:

  • 缓冲区()
  • 胁迫
  • 实习医生()

  • 只需使用:Classname()创建一个对象。

    只是另一个示例:

    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() 
    
    一个如何创建对象“二”? constr()或c()都不起作用;而且 似乎apply把它变成了一个 类型

    上述意见是针对本准则提出的:

    >>> 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
    返回。这是另一个例子

    >>> Three = type('Three', (Two, ), {'foo': 'bar'})
    >>> type(Three)
    <type 'type'>
    >>> three = Three()
    >>> type(three)
    <class '__main__.Three'>
    
    >Three=type('Three',(Two,),{'foo':'bar'})
    >>>类型(三)
    >>>三=三
    >>>类型(三)
    
    您可以看到,
    type
    是一个可以实例化的类。它的构造函数有三个参数:类的名称、基类的元组和包含类属性的字典。它返回一个新的
    类型
    aka类

    至于最后一个问题,

    当你通过一门课时会发生什么 而是将一个实例转换为一个方法


    你得说得更具体些。类只是
    type
    的实例,第一类对象也是如此。询问将类传递给方法会发生什么就像询问将整数传递给方法会发生什么一样:这完全取决于该方法的期望值。

    这与调用x=myClass()有什么不同。也许我在这里遗漏了什么。@pyfunc:当然,在这个例子中,它没有什么不同;关键是,您可以将类传递给函数,然后这些函数执行实例化(以及任何任意操作,如预设一些值),并简单地返回对象。因为很明显,OP就是想这么做的。我认为像apply这样的函数已经被弃用了,或者不被认为是现代用法的一部分。请参阅我回复中的指针。“合适的变量名应该是cls”——嗯,为什么?Aaron,你提出的第二个问题(将一个类传递到一个方法中)实际上只是一个愚蠢的问题,以确保幕后没有任何事情发生。(.net背景::)你回答说,这与传递int或string是一样的。谢谢@poke
    def\uuuu init\uuuuu(this,foo):this.\ufoo=foo+1
    。众所周知,人们应该根据变量的名称来命名变量,如果不能命名,则按照约定来命名。类似乎得到了名称
    cls
    @poke仔细想想,工厂函数可以传入。Demas,我听说过python中的globals有一段时间了,但从来没有真正把它固定下来。globals()在这方面有什么作用?另外,你回答了我的下一个谷歌问题。如何从其他模块导入。谢谢@库廷,去谷歌。这是一种非常不标准的进口方式。当您只知道在运行时导入的内容的名称时,它非常有用。首先学习标准
    import
    first.globals()表示当前全局符号表的字典。
    >>> Three = type('Three', (Two, ), {'foo': 'bar'})
    >>> type(Three)
    <type 'type'>
    >>> three = Three()
    >>> type(three)
    <class '__main__.Three'>