Python-检查类是否存在

Python-检查类是否存在,python,class,if-statement,while-loop,Python,Class,If Statement,While Loop,是否有方法检查类是否已定义/存在? 我在菜单上有不同的选项,其中一些需要继承变量,因此如果在设置变量之前尝试选择该函数,它会崩溃。 我的类叫做Gen0,我一开始只是把 class Gen0(): 然后是设置变量的其余代码。 在上下文中,我正在创建一个总体模型,因此在显示选项2之前,需要使用选项3或导出选项4将初始值设置为选项1。您可能需要寻找解决方案,而不是检查变量是否存在。例如: try: print(var) except NameError: var = 2 print

是否有方法检查类是否已定义/存在? 我在菜单上有不同的选项,其中一些需要继承变量,因此如果在设置变量之前尝试选择该函数,它会崩溃。 我的类叫做Gen0,我一开始只是把

class Gen0():
然后是设置变量的其余代码。
在上下文中,我正在创建一个总体模型,因此在显示选项2之前,需要使用选项3或导出选项4将初始值设置为选项1。

您可能需要寻找解决方案,而不是检查变量是否存在。例如:

try:
   print(var)
except NameError:
   var = 2
   print(var)
如果在这段代码之前没有定义var,它将把它分配给2并打印出来。

我猜gen0的定义如下:

class gen0:
    pass
与创建对象时初始化类中的属性不同

class gen0:
    def __init__(self):
        # this function will be run when you call "g = gen0()"
        # in the main body of you code. and the following properties 
        # will be set on object "g"
        self.juvenile_population = 0
        self.juv.... etc
所以我也猜,当你在设置之前试图访问像青少年人口这样的东西时,你会得到一个AttributeError

正确初始化类是进行面向对象编程的最好方法

然而,你的问题的字面答案是:

 g = gen0()
 if "juvenile_population" in dir(g):
      .... etc

请注意,这只检查对象是否具有未成年人填充属性,您需要更多的这些语句来检查每个属性,类似地,您可以在中使用EAFP方法,但这将使用try语句大量扩展您的代码。

您的情况并不完全清楚,所以我要回答一个问题,有没有办法检查类是否已经定义/存在

是的,有多种方法可以检查类是否已在当前范围内定义。我会看几个

1.请求原谅总比得到允许好 试着用它

try:
    var = MyClass()
except NameError:
    # name 'MyClass' is not defined
    ...
除了确保导入/定义了类之外,这可能是最具python风格的方法

2.查看当前范围 当前范围内的所有内容都由dir提供。当然,这不会处理进口的东西!除非它们是直接进口的

if not 'MyClass' in dir():
    # your class is not defined in the current scope
    ...
3.检查模块的内容 也许您想知道该类是否定义在特定模块my_模块中。因此:


现在,值得指出的是,如果在任何时候您在生产代码中使用这些类型的东西,那么您的代码可能写得很糟糕。您应该始终知道在任何给定点哪些类在范围内。毕竟,这就是为什么我们有导入语句和定义。我建议您使用更多的示例代码来清理问题,以获得更好的回答。

最近,我在编写自定义协议时遇到了相同的问题。这是我的解决方案,无需额外模块,无需评估:

导入处理程序 ... 跳过 创建示例请求 请求={'message':'Test','param1':True,'param2':False} Handler=getattrhandlers,“\uuuu dict\uuuuuuu”,{}.getrequest.get'message” 如果不是处理程序: 引发InvalidRequestException“无效请求” handler=handler请求 处理请求。。。 ... 跳过
它不区分类/函数–您应该进行额外检查。

在python 3.8中,您可以执行以下操作:

class_name = "MyClass"
is_class_in_scope = globals().get(class_name) is not None
例如:

>>>从django.test导入TestCase >>>全球的 {uuuuu名称:''uuuuu主文件',''uuuuu文档':无','uuuuu包':无','uuuuuu装入器':,'uuuu规范':无','uuuuuu注释:{},'.'uuuuuuuuuuuuu内置文件','TestCase':} >>>globals.get'TestCase'不是None 符合事实的
类Gen0是如何定义的?您可能可以使用hasattr内置函数来实现这一点,但更好的做法是始终在类的_uinit__;方法中初始化这些变量。在设置变量的选项的开头,它只是说class Gen0:try:class DisplayGen0:printGen0.u除name之外的其他填充错误:pass这不起作用-还有什么想法吗?@ollie,你只在定义类时使用class关键字,而不是在使用它时。我认为你应该多读一点语法,否则你会对很多错误感到非常沮丧。从这里开始:如果我要正确初始化属性,那么如何检查类变量是否存在?是否有任何不同,或者初始化它们只是一种好的做法?或者将它们设置为一个合理的默认值,例如self.vari=None。然后您可以使用if g.vari:。。。。。
class_name = "MyClass"
is_class_in_scope = globals().get(class_name) is not None