假设我有一些非常相似但有细微差别的函数foo_US, foo_EU, foo_JP
。在main()
或其他函数中,程序传递参数region
,并调用其中一个foo
函数。有什么不同的方法可以做到这一点,以及如何优雅/高效地完成。
我现在能想到的唯一方法是分别定义所有foo
函数并使用if
语句检查提供的region
,然后调用相应的函数。
就像这样。
# region = 'US' # for example
if region == 'US':
foo_US()
elif region == 'EU':
foo_EU()
# and so on ...
但是,这需要单独声明所有foo_someRegion
是否有可能为所有foo
函数声明一个基类,因此对于每个特定的foo函数,我只需要编写微小的差异(foo函数应具有相同的功能)。此外,有没有办法让一个基类country
例如,然后将每个区域作为派生类,以便调用foo将导致相应的foo被调用?类似于pet
基类包含cat
和dog
子类cat.speak()
返回meow
和dog.cry()
返回woof
}。
如果有任何不清楚的地方,请告知我们,我们非常感谢任何指导。谢谢!
答案 0 :(得分:3)
一个(在我看来)解决这个问题的好方法是使用字典
regionFunction = {
'US': foo_US,
'EU': foo_EU,
...
}
regionFunction(region)()
您建议为每个地区创建额外课程也是一种选择。选择哪种方法取决于(在我看来)你需要做多少次这种事情。 如果这是您的代码中唯一需要根据区域调用不同函数的时间,那么我建议使用字典。如果你需要更频繁地做,我建议使用课程。
答案 1 :(得分:1)
我将做一个简单的例子,但基本上你需要一个包含每个区域函数作为方法的类,然后用getattr()
调用这些函数,它允许你通过名称调用类的方法字符串。
class Region(object):
def foo_US(self):
print('US method')
def foo_GB(self):
print('GB method')
# so on...
my_region = 'foo_US'
my_region_function = getattr(Region, my_region)
my_region_function()
# >>> US method
答案 2 :(得分:1)
foo_XY
函数是否需要单独定义取决于它们的作用。如果它们足够相似,您可以编写一个基础foo
,它可以执行标准操作,但必要时可以覆盖它。例如:
class Region(object):
key = None
def foo(self):
# Do something standard
print(self.key)
class EURegion(Region):
key = 'EU'
class USRegion(Region):
key = 'US'
class WeirdRegion(Region):
key = 'WEIRD'
def foo(self):
# Do something different
print('!!!')
在脚本的主要功能中,您可以使用key
动态检索指定区域:
# Elided: retrieve region key from command line
regions = {cls.key: cls for cls in Region.__subclassess__()}
region = regions[key]()
region.foo()