在 isinstance 中仅使用 class 不带名称空间的名称
Use only class name without namespace in isinstance
这在脚本中有效以识别 a 是否属于 class myproject.aa.RefClass
isinstance(a, myproject.aa.RefClass)
但是我该怎么做才能不必指定完整的命名空间?我希望能够输入:
isinstance(a, RefClass)
这在 Python 中是如何完成的?
编辑:让我提供更多细节。
在模块 aa.referencedatatable.py 中:
class ReferenceDataTable(object):
def __init__(self, name):
self.name = name
def __call__(self, f):
self._myfn = f
return self
def referencedatatable_from_tag(tag):
import definitions
defn_lst = [definitions]
for defn in defn_lst:
referencedatatable_instance_lst = [getattr(defn, a) for a in dir(defn) if isinstance(getattr(defn, a), ReferenceDataTable)]
for referencedatatable_instance in referencedatatable_instance_lst
if referencedatatable_instance.name == tag
return referencedatatable_instance
raise("could not find")
def main()
referencedata_from_tag("Example")
在模块 aa.definitions.py 中:
from aa.referencedatatable import ReferenceDataTable
@ReferenceDataTable("Example")
def EXAMPLE():
raise NotImplementedError("not written")
出于某种原因,从 aa.referencedatatable.py
调用 main 将抛出异常,因为它将无法识别 class 的实例。但是,如果我将这个 main 复制到另一个模块中,它将起作用:
import aa.referencedatatable
a = aa.referencedatatable.referencedatatable_from_tag("Example")
print a
第二个示例有效,出于某种原因,在声明 class 的同一模块中调用此函数无效。
'namespace'只是一个模块对象,class也是。您始终可以将 class 分配给不同的名称:
RefClass = myproject.aa.RefClass
或者更好的是,将其直接导入到您自己的命名空间中:
from myproject.aa import RefClass
无论哪种方式,现在您都有一个引用 class 对象的全局名称 RefClass
,因此您可以:
isinstance(a, RefClass)
这在脚本中有效以识别 a 是否属于 class myproject.aa.RefClass
isinstance(a, myproject.aa.RefClass)
但是我该怎么做才能不必指定完整的命名空间?我希望能够输入:
isinstance(a, RefClass)
这在 Python 中是如何完成的?
编辑:让我提供更多细节。
在模块 aa.referencedatatable.py 中:
class ReferenceDataTable(object):
def __init__(self, name):
self.name = name
def __call__(self, f):
self._myfn = f
return self
def referencedatatable_from_tag(tag):
import definitions
defn_lst = [definitions]
for defn in defn_lst:
referencedatatable_instance_lst = [getattr(defn, a) for a in dir(defn) if isinstance(getattr(defn, a), ReferenceDataTable)]
for referencedatatable_instance in referencedatatable_instance_lst
if referencedatatable_instance.name == tag
return referencedatatable_instance
raise("could not find")
def main()
referencedata_from_tag("Example")
在模块 aa.definitions.py 中:
from aa.referencedatatable import ReferenceDataTable
@ReferenceDataTable("Example")
def EXAMPLE():
raise NotImplementedError("not written")
出于某种原因,从 aa.referencedatatable.py
调用 main 将抛出异常,因为它将无法识别 class 的实例。但是,如果我将这个 main 复制到另一个模块中,它将起作用:
import aa.referencedatatable
a = aa.referencedatatable.referencedatatable_from_tag("Example")
print a
第二个示例有效,出于某种原因,在声明 class 的同一模块中调用此函数无效。
'namespace'只是一个模块对象,class也是。您始终可以将 class 分配给不同的名称:
RefClass = myproject.aa.RefClass
或者更好的是,将其直接导入到您自己的命名空间中:
from myproject.aa import RefClass
无论哪种方式,现在您都有一个引用 class 对象的全局名称 RefClass
,因此您可以:
isinstance(a, RefClass)