从类调用函数而不声明名称对象

时间:2015-05-07 10:11:54

标签: python class object

我们有一棵树,每个节点都是一个对象。

此树具有的功能是3 add(x);getmin();getmax()

树很完美;例如,如果我写

a = Heap()
a.add(5)
a.add(15)
a.add(20)
a.getmin()
a.getmax()

堆栈看起来像[5,15,20],现在,如果我调用getmin(),它将打印min element = 5,堆栈将显示为[15,20],依此类推。

现在问题出现了;

教授要求我们提交两个已创建的文件:main.pyminmaxqueue.py

main.py就像这个from minmaxqueue import add, getmin, getmax一样开始,然后已经有了一个类型的函数调用列表

add(5)
add(15)
add(20)
getmin()
getmax()

为了使我的脚本工作,我必须a=Heap(),然后始终致电a.add(x)。由于TA将从公共文件运行脚本,因此无法修改main.py,以便创建对象a=Heap()。它应该直接与add(5)一起运行,而不是与a.add(5)

一起运行

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:4)

您可以修改模块以创建全局Heap实例,并定义将所有内容转发到该全局实例的函数。像这样:

class Heap(object):
    # all of your existing code

_heap = Heap()
def add(n):
    return _heap.add(n)
def getmin():
    return _heap.getmin()
def getmax():
    return _heap.getmax()

或者,稍微简单一点:

_heap = Heap()
add = _heap.add
getmin = _heap.getmin
getmax = _heap.getmax

如果你看一下标准库,有些模块就是这样做的,比如random。如果要创建多个Random实例,则可以;如果你不关心这样做,你可以只调用random.choice,它可以在隐藏的全局实例上运行。

当然Random有道理;对Heap来说,这更值得怀疑。但如果这就是教授的要求,你能做什么?

答案 1 :(得分:1)

您可以使用此功能更快地完成此操作:

def make_attrs_global(obj):
    for attr in dir(obj):
        if not attr.startswith('__'):
            globals()[attr] = getattr(obj, attr)

它使obj的所有属性在全局范围内定义。 只需将此代码放在minmaxqueue.py文件的末尾:

a = Heap()
make_attrs_global(a)

现在,您应该可以在没有add的情况下直接致电a。这很难看但很好......