有没有办法检查某个类是否已定义/存在? 我在菜单上有不同的选项,其中一些需要继承变量,所以如果你在设置变量之前尝试选择该功能,它就会崩溃。 我的班级名为Gen0,我只是简单地把它开始了
class Gen0():
接下来是代码的其余部分来设置变量。 对于上下文,我正在进行填充模型,因此需要在显示(选项2),使用(选项3)或导出(选项4)之前设置初始值(选项1)。
答案 0 :(得分:4)
您的情况并不完全清楚,所以我只是回答问题"有没有办法检查某个班级是否已被定义/存在?"
是的,有办法检查当前范围内是否已定义类。我会经历一些。
尝试使用它!
try:
var = MyClass()
except NameError:
# name 'MyClass' is not defined
...
这可能是最恐怖的方法(除了确保你导入/定义了类)。
当前范围内的所有内容均由dir()
提供。当然,这不会处理导入的东西! (除非它们是直接进口的。)
if not 'MyClass' in dir():
# your class is not defined in the current scope
...
也许您想查看该类是否在特定模块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
,则会将其分配给2
和print
。
答案 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