如何判断一个方法是否是第一次被调用

7

我希望能够知道方法何时第一次被调用。主要是为了在打印到定界文件时使用,如果这是第一次迭代,我想在实际信息之前打印标题。这是我通常做的事情:

def writeFile(number, count):
    if count == 1:
        print('number')
        print(str(count))
    else:
        print(str(count))


count = 1
for i in range(10):
    writeFile(i, count)
    count += 1

这将提供以下输出:
number
1
2
3
4
5
6
7
8
9
10

尽管这样可以达到我想要的目标,但我很好奇是否有更好/更有效的方法来做到这一点。是否有某种方法可以检测一个方法是否是第一次被调用,而无需传递额外的参数?
谢谢,

1
我认为你的方法很好 - 即,使用第二个参数来指示是否是第一次。我会将其命名为类似于 firstWrite 的布尔类型,并将其默认值设为 False,但这是相同的想法。 - JKillian
1
你可以传递count变量,直接引用全局值... - Chris Pfohl
1
但是还要查看这个答案,因为还有另一种可能的方法:https://dev59.com/oHVC5IYBdhLWcg3wfhGL - JKillian
之前已在此回答:https://dev59.com/CHM_5IYBdhLWcg3wn0lO - Tim 333
1
如果你无论如何都要调用 print(str(count)),那为什么还需要else语句呢? - David Reeve
3
如果你正在从文件中读写内容,为什么不在函数中进行写操作并在循环之前写好标头? - Padraic Cunningham
3个回答

7
有多种方法可以实现此目的。以下是其中三种。
第一种方法:
firstRun=True
def writeFile(number):
    global firstRun
    if firstRun:
        print('number')
        firstRun=False
    print(str(number))

for i in range(10):
    writeFile(i)

第二点:

def writeFile(number):
    print(str(number))

for i in range(10):
    if not i:
        print('number')
    writeFile(i)

第三步:

for i in range(10):
    print(('' if i else 'number\n')+str(i))

我猜想这只是一个测试问题,旨在说明函数调用初始化或重置数据的情况。我更喜欢隐藏信息不让调用函数知道(比如1)。我是Python新手,可能使用了不好的做法。


5

在调用函数之前,您可以将标题写入文件。 这将消除您对if语句的需求。 我是一个基本级别的程序员,但这似乎很合理。 例如:

def writeFile(count):
    print(str(count))

print('number')
for i in range(10):
    writeFile(i)

3

相比其他答案,这个方法更加深入一些,但我更喜欢它,因为它利用了Python的面向对象特性。其思想是将“called”变量分配给函数本身:这可以实现,因为在Python中,所有东西都是一个对象(即使是函数在其自己的作用域内)。

这个概念也可以扩展到除类作用域之外的其他作用域定义的函数上。

class SampleClass:
    def sample(self, *args, **kwargs):
        try:
            if self.__class__.sample.called:
                # do what you have to do with the method 
                print("normal execution")
        except AttributeError:
            # do what you have to do with the first call
            print("first call")
            self.__class__.sample.called = True
            self.__class__.sample(self, *args, **kwargs)

例子:

>>>SampleClass().sample()
first call
normal execution
>>>SampleClass().sample()
normal execution

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接