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