条件类创建(Python)

atp*_*atp 7 python

从教程:"类定义是一个可执行语句."

以下是脚本中推荐的内容吗?

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

else:
    class Hello:
        def __init__(self):
            self.greeting = "Salut!"
Run Code Online (Sandbox Code Playgroud)

Rad*_*ski 10

你甚至可以这样做

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

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

if my_switch:
    Hello = Salut
Run Code Online (Sandbox Code Playgroud)

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


aar*_*ing 5

是的,代码有效.但为什么不运行代码来找出?

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


Rus*_*ove 5

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

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

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


gre*_*ggo 5

您还可以在类内部的“声明”周围放置条件,因为它们是作为类构造的一部分执行的:

class Hello:
    if my_switch:
        igreeting = "Hello!"
    else:
        igreeting = "Salut!"       
    def __init__(self, greeting):
            self.greeting = self.igreeting
Run Code Online (Sandbox Code Playgroud)

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

或者只是简单的

class Hello:
    if my_switch:
        greeting = "Hello!"
    else:
        greeting = "Salut!"       
Run Code Online (Sandbox Code Playgroud)

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


mar*_*eau 5

如果你更喜欢它,你可以将每个类定义放在一个单独的.py文件中,而只是import你想要的那个.类似于以下内容:

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

h = Hello()
Run Code Online (Sandbox Code Playgroud)