首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >基于用户输入实例化对象的Pythonic方法

基于用户输入实例化对象的Pythonic方法
EN

Stack Overflow用户
提问于 2018-07-27 04:23:33
回答 1查看 47关注 0票数 0

我正在为FFmpeg编写一个面向对象风格的Python包装器。我创建了多个编解码器类的概念,每个编解码器类都有自己的实例变量集。例如,AACCodec类可能有一个cutoff_frequency实例变量,如下所示:

代码语言:javascript
复制
class AACCodec(Codec):

    def __init__(self, **kwargs):
        self.cutoff_frequency = 20000

其中,FLAC编解码器类可能具有compression_ratio实例变量,例如:

代码语言:javascript
复制
class FLACCodec(Codec):

    def __init__(self, **kwargs):
        self.compression_ratio = 0.78

基本上,在我的代码中的其他地方(在ffmpeg.py中),我希望能够通过进行如下调用来创建正确的编解码器对象:

代码语言:javascript
复制
import ffcodecs
newCodec = somefunctioncall('aac', 'key1'=value1, 'key2'=value2)

我考虑实现这一点的方法是在ffcodecs.py中使用一个函数,它根据输入字符串返回编解码器对象:

代码语言:javascript
复制
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语句。

一定有一种更优雅的方式来做这件事。

EN

回答 1

Stack Overflow用户

发布于 2018-07-27 04:30:12

也许不是最好的,但你可以做到

代码语言:javascript
复制
def getCodec(name, **kwargs):
    codecObjects = {
        'aac' : AACCodec,
        'ogg' : OGGCodec,
        'flac': FLACCodec
    }

    return codeObjects[name](**kwargs)

毕竟,您正在尝试将一个字符串映射到一个类,但只需要实例化一个

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51546989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档