这是通过文档提供的:
NewClass = types.new_class("NewClassName", (SuperClass,), kwds = { "namespace" : my_ontology })
我不明白为什么代码不起作用。我写过:
NewClass = types.new_class("NewClassName", (Example,), kwds = { "namespace" : onto })
我还尝试了无法通过url运行的代码:Owlready2 dynamic class generation
types.new_class("NewClassName", (onto["ParentClass"],))
我不理解该表达式(onto [“ ParentClass”],)。然后,我不了解如何动态创建个人。可以做到吗?
我可以有一个简短的简单示例脚本,该示例适用于类和个人吗?
答案 0 :(得分:1)
from owlready2 import *
# check that the base class is accessible
print(Thing) # owl.Thing
my_onto = get_ontology('http://test/qwerty')
with my_onto:
my_new_class = types.new_class("NewClassName", (Thing,)) # make a class
print(my_new_class) # qwerty.NewClassName
my_obj = my_new_class("myObjName") # make an instance
print(my_obj) # qwerty.myObjName
请注意从owlready2.Thing
(以我的情况为准)或其任何子类派生自定义类。
创建个体很简单,就像创建顺序python实例(使用对创建的类(在我的情况下为my_new_class
的引用的变量)作为构造函数,因此调用它以获取新的实例)。不需要将该呼叫放在with my_onto:
块中。
因此,可以通过以下方式访问新创建的实体:
class_var = my_onto.NewClassName
class_var = my_onto["NewClassName"] # returns None if you pass wrong string
obj_var = my_onto.myObjName
obj_var = my_onto["myObjName"]
请注意,如果实例已经存在,则不会创建。因此,以下代码始终返回True
:
my_onto["myObjName"] is my_onto["myObjName"] # True
我是通过最近发布的Python3.7和Owlready2 v0.23(截至pip install -U owlready2
开始)来做到这一点的。
(onto["ParentClass"],)
仅从本体onto
获得所需的基类,并将其打包为一个元组(请注意语法(a,)
来创建一个元素的元组)。