像类一样初始化函数

时间:2014-07-10 09:04:10

标签: python function initialization generator

很多时候我需要让一个简单的函数在第一次调用时做一些不同的事情。原因有很多,但通常我需要一个变量初始化,如果第一次运行。有时我可以在功能之外或内部处理问题,但事情有时会变得混乱,我不喜欢使用"全局"如果我可以避免它们。

我的解决方案来自发电机。我发现我可以"初始化"一个函数,或者" prime"我称之为函数,通过在程序中使用next()调用并结合一个被尊重的" yield"在函数中的循环之上。像魅力一样。

现在我的问题是:有没有更好的方法可以让我失踪?

一个WoNUX - 工作但无用的例子:

o_PrintList = g_PrintThis() ## Creates func object
o_PrintList.next() ## 'Primes' the func
o_PrintList.send(9) ## Sends argument to the func
o_PrintList.send(10) ## Another argument to the func

def g_PrintThis():
    v_PrintList = [] ## Inits the variable. If stnd func call this would happen everytime
    print("Initialized")
    v_Num = yield ## Waits for first send argument
    while True: ## Infinite loop. Could be a for loop, etc.
        v_PrintList.append(v_Num) ## Reason v_PrintList needs 'primed'
        if not v_PrintList:
            print("PrintList is empty:")
        else:
            print("Printlist: %s") %(v_PrintList)
        v_Num = yield ## Waits for next send argument, if ever one comes

感谢。

3 个答案:

答案 0 :(得分:3)

一种选择是使用实际的类。您可以实现__call__以在调用时定义适当的行为:

class PrintThis(object):

    def __init__(self, print_list=None):
        if print_list is None:
            print_list = []
        self.print_list = print_list

    def __call__(self):
        if self.print_list:
            print("Print list: {0}".format(self.print_list))
        else:
            print("Print list empty.")

    def send(self, item):
        self.print_list.append(item)

使用中:

>>> p = PrintThis()
>>> p()
Print list empty.
>>> p.send(9)
>>> p.send(10)
>>> p()
Print list: [9, 10]

答案 1 :(得分:1)

在Python中,函数可以有属性,因此测试给定属性是否存在将允许您确定是否需要初始化:

def f(args):
    if not hasattr(f, "guard"):
        print "Initializing"
        f.guard = None
    print "Called with", args

f("one")
f("two")

打印

Initializing
Called with one
Called with two

这避免了使用全局变量,这些变量通常代表麻烦的潜在问题(如果其他代码使用相同的全局变量,只询问一个相关问题)。

答案 2 :(得分:1)

函数也是类(确切地说是第一类)。当你调用一个函数时,你实际上调用了函数的类'__call__方法,它也是一个类。

与jonrsharpe所说的一样,创建一个类并实现__init____call__方法。