在Python中处理不同类型的规范方法是什么?

Pro*_*ica 6 python oop paradigms

我有一个函数,我需要为我调用的另一个程序生成不同的输出字符串,具体取决于它想要的类型.

基本上,被调用的程序需要一个命令行参数来告诉它调用它的类型.

令人高兴的是,我在SO上找到了关于如何检查变量类型的答案.但我注意到人们也提出异议,检查类型背叛了"非面向对象"的设计.那么,还有其他一些方法,在不明确检查类型的情况下,可以采用更"面向对象"的方式处理这个问题吗?

我现在的代码是这样的:

def myfunc(val):
    cmd_type = 'i'
    if instance(val, str):
        cmd_type = 's'

    cmdline = 'magicprogram ' + cmd_type + ' ' + val
    Popen(cmdline, ... blah blah)
    ...
Run Code Online (Sandbox Code Playgroud)

哪个工作得很好,但我只是想知道是否有一些我不知道的技术.

mar*_*eau 3

我不认为双重调度或多方法特别相关,也与人们对其他 SO 答案的反对意见没有太大关系。

毫不奇怪,为了使您所做的事情更加面向对象,您需要向其中引入一些对象(和相应的类)。使每个值成为类的实例将允许(事实上,实际上强制)您停止检查其类型。下面对示例代码的修改显示了一种非常简单的方法:

class Value(object):
    """ Generic container of values. """
    def __init__(self, type_, val):
        self.type = type_   # using 'type_' to avoid hiding built-in
        self.val = val

def myfunc(val):
    # Look ma, no type-checking!
    cmdline = 'magicprogram {obj.type} {obj.val}'.format(obj=val)
    print 'Popen({!r}, ... blah blah)'.format(cmdline)
    # ...

val1 = Value('i', 42)
val2 = Value('s', 'foobar')

myfunc(val1)  # Popen('magicprogram i 42', ... blah blah)
myfunc(val2)  # Popen('magicprogram s foobar', ... blah blah)
Run Code Online (Sandbox Code Playgroud)

如果类中有方法可以间接访问其属性,那么它会更加面向对象Value,但只需执行上述操作就可以摆脱臭名昭著的类型检查。更加面向对象的设计可能会为每种类型都有一个不同的子类Value,所有这些子类都为客户端共享一组通用的方法,例如myfunc(),用于创建、操作和从中提取信息。

使用对象的另一个好处是,如果/当您向应用程序添加对新类型“Value”的支持时,您不必进行修改myfunc()- 如果您对“Value”本质的抽象是好的,那么是。