从教程:“类定义是一个可执行语句。”
脚本中是否推荐以下内容?
my_switch = False
if my_switch:
class Hello:
def __init__(self):
self.greeting = "Hello!"
else:
class Hello:
def __init__(self):
self.greeting = "Salut!"
答案 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!