还记得上一次函数调用的结果吗?

时间:2018-10-23 06:12:01

标签: python python-3.x algorithm class

我最近在求职面试中遇到了编码挑战,问题很简单。编写一个具有两个功能的类:(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()中的两个集合,但显然不起作用。

1 个答案:

答案 0 :(得分:1)

您可以在self.returned_host_names方法内初始化self.host_type_so_farallocate,而不必使用hasattr来检查对象是否已经具有属性。为了防止deallocate方法因未初始化的self.returned_host_names而引起的异常(如果在allocate之前调用它,可以在其周围添加一个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__方法,即使您是没有提供一个。以上只是您如何使其工作的示例,但是该方法不应在任何生产代码中使用。