记住上次函数调用的结果?

2024-09-28 16:22:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近在一次面试中遇到了一个编码挑战,问题很简单。编写一个有两个函数的类:(1)allocate(some_string),它根据参数返回字符串,但返回值是参数加上一个数字。例如,调用allocate("apple")将返回apple1,再次调用它将返回apple2,依此类推。(2) deallocate(some_string)接受一个参数并使该字符串再次可用。也就是说,如果我调用deallocate(“apple1”),然后再次调用allocate("apple"),那么allocate会返回apple1。你知道吗

这是我的密码:

class Tracker:
    def __init__(self):
        self.returned_host_names = set()
        self.host_type_so_far = set()

    def allocate(self, host_type):
        self.counter = 0
        self.host_type_so_far.add(host_type)
        if host_type in self.host_type_so_far:
            self.counter+=1
        while True:
            maybe_hostname = host_type + str(self.counter)
            if maybe_hostname not in self.returned_host_names:
                self.returned_host_names.add(maybe_hostname)
                print(self.returned_host_names)
                return maybe_hostname
            else: 
                self.counter+=1

    def deallocate(self, hostname):
        if hostname in self.returned_host_names:
            self.returned_host_names.remove(hostname)

实际上,代码并没有附带__init__;这是我自己添加的。我目前正在使用这两个集合来记住返回的内容,然后取消分配以将它们从集合中移除。我的问题是,既然__init__没有给出,我有没有其他的方法来编写分配?我最初的想法是在allocate()中初始化这两个集合,但显然这不起作用。你知道吗


Tags: selfhost参数sonamesinitdeftype
1条回答
网友
1楼 · 发布于 2024-09-28 16:22:47

您可以在allocate方法中初始化self.returned_host_namesself.host_type_so_far,而不是通过检查对象是否已经具有该属性或没有使用hasattr。为了防止deallocate方法由于在allocate之前调用的self.returned_host_names未初始化而引发异常,可以在其周围添加try-except块:

class Tracker:
    def allocate(self, host_type):
        if not hasattr(self, 'returned_host_names'):
            self.returned_host_names = set()
            self.host_type_so_far = set()
        self.counter = 0
        self.host_type_so_far.add(host_type)
        if host_type in self.host_type_so_far:
            self.counter+=1
        while True:
            maybe_hostname = host_type + str(self.counter)
            if maybe_hostname not in self.returned_host_names:
                self.returned_host_names.add(maybe_hostname)
                print(self.returned_host_names)
                return maybe_hostname
            else:
                self.counter+=1

    def deallocate(self, hostname):
        try:
            if hostname in self.returned_host_names:
                self.returned_host_names.remove(hostname)
        except AttributeError:
            pass

请注意,在__init__方法之外初始化实例属性不是一个好的做法,我非常怀疑面试官是否真的不希望您编写自己的__init__方法,即使您没有提供该方法。以上只是一个示例,说明了如何使其工作,但该方法不应在任何生产代码中使用。你知道吗

相关问题 更多 >