Python - 检查是否存在类

时间:2016-07-03 15:03:44

标签: python class if-statement while-loop

有没有办法检查某个类是否已定义/存在? 我在菜单上有不同的选项,其中一些需要继承变量,所以如果你在设置变量之前尝试选择该功能,它就会崩溃。 我的班级名为Gen0,我只是简单地把它开始了

class Gen0():

接下来是代码的其余部分来设置变量。 对于上下文,我正在进行填充模型,因此需要在显示(选项2),使用(选项3)或导出(选项4)之前设置初始值(选项1)。

5 个答案:

答案 0 :(得分:4)

您的情况并不完全清楚,所以我只是回答问题"有没有办法检查某个班级是否已被定义/存在?"

是的,有办法检查当前范围内是否已定义类。我会经历一些。

1。请求宽恕比允许更好

尝试使用它!

try:
    var = MyClass()
except NameError:
    # name 'MyClass' is not defined
    ...

这可能是最恐怖的方法(除了确保你导入/定义了类)。

2。查看当前范围

当前范围内的所有内容均由dir()提供。当然,这不会处理导入的东西! (除非它们是直接进口的。)

if not 'MyClass' in dir():
    # your class is not defined in the current scope
    ...

3。检查模块的内容

也许您想查看该类是否在特定模块my_module中定义。所以:

import my_module
import inspect

if not 'MyClass' in inspect.getmembers(my_module):
    # 'MyClass' does not exist in 'my_module'
    ...

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

答案 1 :(得分:0)

您可能希望选择EAFP解决方案,而不是检查变量是否存在。例如:

try:
   print(var)
except NameError:
   var = 2
   print(var)

如果在此段代码之前未定义var,则会将其分配给2print

答案 2 :(得分:0)

我猜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之前尝试访问juvenile_population之类的内容时会得到 g = gen0() if "juvenile_population" in dir(g): .... etc

正确初始化类是进行面向对象编程的最佳方法恕我直言。

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

juvenile_population

请注意,这仅检查对象是否具有try属性,您需要更多这些语句来检查每个属性,类似地,您可以在Douglas' answer中使用EAFP方法,但这又是使用if(gclid) { ga('set', 'location', document.location + '?gclid=' + gclid); } ga('send','pageview') 语句批量编写代码。

答案 3 :(得分:0)

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

import handlers

# ... skip ...
# create example request
request = {'message': 'Test', 'param1': True, 'param2': False}

Handler = getattr(handlers, '__dict__', {}).get(request.get('message'))
if not Handler:
  raise InvalidRequestException('Invalid request')

handler = Handler(request)
# process request...

# ... skip ...

它不能区分类/功能-您应该进行额外的检查。

答案 4 :(得分:0)

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

client.login('')

示例:

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