我正在为FFmpeg编写一个面向对象风格的Python包装器。我创建了多个编解码器类的概念,每个编解码器类都有自己的实例变量集。例如,AACCodec类可能有一个cutoff_frequency
实例变量,如下所示:
class AACCodec(Codec):
def __init__(self, **kwargs):
self.cutoff_frequency = 20000
其中,FLAC编解码器类可能具有compression_ratio
实例变量,例如:
class FLACCodec(Codec):
def __init__(self, **kwargs):
self.compression_ratio = 0.78
基本上,在我的代码中的其他地方(在ffmpeg.py
中),我希望能够通过进行如下调用来创建正确的编解码器对象:
import ffcodecs
newCodec = somefunctioncall('aac', 'key1'=value1, 'key2'=value2)
我考虑实现这一点的方法是在ffcodecs.py
中使用一个函数,它根据输入字符串返回编解码器对象:
def getCodec(name, **kwargs):
codecObjects = {
'aac' : AACCodec(**kwargs),
'ogg' : OGGCodec(**kwargs),
'flac': FLACCodec(**kwargs)
}
return codecObjects[name]
这样做的问题是,每当我调用getCodec()
时,它都会在声明codecObjects
时为每个编解码器创建一个实例。我在每个编解码器__init__
中都有逻辑来检查**kwargs
是否与对象的实例变量(self.cutoff_frequency, self.compression_ratio
等)匹配。如果不是,那就错了。
在一次调用中实例化正确的对象并且只实例化正确的对象的最Pythonic方法是什么?
一种解决方案是只有一组if
/else if
语句来匹配每个编解码器字符串并相应地返回每个对象,但是如果我最终维护了一组不同的编解码器,我不希望每次实例化一个新对象时都有一百条if/else
语句。
一定有一种更优雅的方式来做这件事。
发布于 2018-07-27 04:30:12
也许不是最好的,但你可以做到
def getCodec(name, **kwargs):
codecObjects = {
'aac' : AACCodec,
'ogg' : OGGCodec,
'flac': FLACCodec
}
return codeObjects[name](**kwargs)
毕竟,您正在尝试将一个字符串映射到一个类,但只需要实例化一个
https://stackoverflow.com/questions/51546989
复制相似问题