我最近在求职面试中遇到了编码挑战,问题很简单。编写一个具有两个功能的类:(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()
中的两个集合,但显然不起作用。
答案 0 :(得分:1)
您可以在self.returned_host_names
方法内初始化self.host_type_so_far
和allocate
,而不必使用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__
方法,即使您是没有提供一个。以上只是您如何使其工作的示例,但是该方法不应在任何生产代码中使用。