如何使用owlready2动态创建类和个人?

时间:2019-02-10 19:27:17

标签: python

这是通过文档提供的:

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”],)。然后,我不了解如何动态创建个人。可以做到吗?

我可以有一个简短的简单示例脚本,该示例适用于类和个人吗?

1 个答案:

答案 0 :(得分:1)

  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开始)来做到这一点的。

  1. 代码(onto["ParentClass"],)仅从本体onto获得所需的基类,并将其打包为一个元组(请注意语法(a,)来创建一个元素的元组)。