条件类创建(Python)

时间:2010-09-16 18:03:47

标签: python

从教程:“类定义是一个可执行语句。”

脚本中是否推荐以下内容?

my_switch = False
if my_switch:
    class Hello:
        def __init__(self):
            self.greeting = "Hello!"

else:
    class Hello:
        def __init__(self):
            self.greeting = "Salut!"

7 个答案:

答案 0 :(得分:9)

你甚至可以做

class Hello:
    def __init__(self):
        self.greeting = "Hello!"

class Salut:
    def __init__(self):
        self.greeting = "Salut!"

if my_switch:
    Hello = Salut

(请注意,您的代码需要小写的Class关键字......)

答案 1 :(得分:5)

是的,代码有效。但为什么不运行代码才能找到?

您也可以使用函数定义执行此操作。

答案 2 :(得分:5)

如果你更喜欢它,你可以将每个类定义放在一个单独的.py文件中,只需要import你想要的那个。如下所示:

if my_switch:
    from hello_en import Hello
else:
    from hello_fr import Hello

h = Hello()

答案 3 :(得分:4)

当然不建议进行本地化,例如在您的示例中。

要考虑的主要问题是在类的专用版本中,有多少代码与不同代码相似。如果只有少量代码不同,或者只有数据不同(“Hello”与“Salut”),则有更好的方法。

我可能会考虑类的条件声明的一种情况是,如果我在两个不同的操作系统上提供功能,并且在两者之间获得该功能是非常不同的。作为一个例子,也许我正在尝试从脚本驱动iTunes,而在MacOS上我使用AppleScript来驱动它,但在Windows上我必须使用COM。我可能会创建一个包装类,我的其余代码可以使用它而不关心正在使用哪个操作系统。

答案 4 :(得分:4)

你也可以在类中包含“声明”条件,因为它们是作为类构造的一部分执行的:

class Hello:
    if my_switch:
        igreeting = "Hello!"
    else:
        igreeting = "Salut!"       
    def __init__(self, greeting):
            self.greeting = self.igreeting

(这里的igreeting是一个类变量,问候成员变量)

或只是简单

class Hello:
    if my_switch:
        greeting = "Hello!"
    else:
        greeting = "Salut!"       

...通常会产生同样的效果。

答案 5 :(得分:3)

这是有效的代码,但并不是真正推荐的格式(假设代码遵循类声明)。因为你最终会使用这个类。假设您仍然使用两个名为相同的类,那么之后可能会令人困惑。也许您应该将函数包装在函数中以返回您创建的类。现在你有一个基本的factory

def HelloFactory(my_switch)
    if my_switch:
        class Hello:
           def __init__(self):
               self.greeting = "Hello!"
    else:
        class Hello:
           def __init__(self):
               self.greeting = "Salut!"
    return Hello

helloClass = HelloFactory(False)
hello = helloClass()
hello.greeting

输出“Salut!”

答案 6 :(得分:0)

您可能不需要像以前那样重复代码。问问自己是否需要重复类构造代码,或者只是在类本身中重复变量?如果是后者,则可以在__init__()中使用参数为两种情况使用相同的类,然后有条件地返回具有所需变量的类的实例:

my_switch = False

class Hello:
    def __init__(self, greeting):
        self.greeting = greeting

if my_switch:
    mygreeting = "Hello!"
else:
    mygreeting = "Salut!"

hello = Hello(mygreeting)
print hello.greeting
# => Salut!