Python类实例化:在没有附带参数的情况下调用类时它意味着什么?

时间:2016-09-14 10:23:45

标签: python class

我正在尝试理解我在github上找到的一些代码。基本上有一个名为" HistoricCSVDataHandler"已从其他模块导入。在main方法中,该类作为参数传递给另一个类" backtest"。

如何在不引发NameError的情况下调用不表示实例化变量的类名。

或者简单地说:

为什么/如何将该类调用为:

Backtest(HistoricCSVDataHandler)

而不是:

CSV_Handler = HistoricCSVDataHandler(foo,bar,etc)
Backtest(CSV_Handler)

See line 110 for code.

此致

3 个答案:

答案 0 :(得分:2)

这是一种名为dependency injection的技术。类是一个对象,就像任何其他对象一样,因此将它作为参数传递给函数然后在函数内调用它没有错。

假设我想要读取字符串并获得intfloat。我可以编写一个函数,将所需的类作为参数:

def convert(s, typ):
    return typ(s)

调用它有几种可能性:

>>> convert(3, str)
'3'
>>> convert('3', int)
3
>>> convert('3', float)
3.0

因此代码中的Backtest函数最有可能创建一个您传递的类的实例 - 它在内部调用HistoricCVSHandler来创建该类的实例

我们通常认为Python对象是某个类的实例。类是类似的对象,实际上是它们所谓的元类的实例,对于从对象继承的类,它们默认为type

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

答案 1 :(得分:0)

代码的链接很有用,但是在python中你可以像这样传递未经实例化的对象。即:

def f(uninst_class, arg):
     return uninst_class(arg)

答案 2 :(得分:0)

将python变量视为标签,可以标记一个类(没有实例),就像给该类别名一样。

>>> class A(): pass
>>> A
<class __builtin__.A at 0x000001BE82279D08>
>>> b = A
>>> b
<class __builtin__.A at 0x000001BE82279D08>
>>> a = b()
>>> a
<__builtin__.A instance at 0x000001BE82269F48>
>>> A()
<__builtin__.A instance at 0x000001BE82269708>

与funtions参数相同,你可以将一个类(没有实例)传递给函数以便后用。

>>> def instantiator(c):
...     return c()
...     
>>> c = instantiator(b)
>>> c
<__builtin__.A instance at 0x000001BE8226A148>
>>> c = instantiator(A)
>>> c
<__builtin__.A instance at 0x000001BE8226A288>