第三十三章 Objects - OREFs
OREFs
对象类的 %New()
方法创建一个内部内存结构来包含对象的数据,并返回指向该结构的 OREF
(对象引用)。 OREF
是 IRIS
中的一种特殊值。应该记住以下几点:
- 在终端中,
OREF
的内容取决于所使用的语言:- 在
ObjectScript
中,会看到一个由数字、@
符号和类名称组成的字符串。 - 在
Python
中,会看到一个包含类名和内存中18
个字符的唯一位置的字符串。
- 在
例如:
TESTNAMESPACE>set myobj=##class(Sample.Person).%New()
TESTNAMESPACE>w myobj
3@Sample.Person
>>> myobj=iris.cls("Sample.Person")._New()
>>> print(myobj)
<iris.Sample.Person object at 0x000001A1E52FFD20>
- 如果没有使用预期的
OREF
或者使用了错误类型的OREF
,IRIS
将返回错误。此错误与ObjectScript
终端和Python
终端不同:
TESTNAMESPACE>set x=2
TESTNAMESPACE>set x.Name="Fred Parker"
SET x.Name="Fred Parker"
^
<INVALID OREF>
>>> x=2
>>> x.Name="Fred Parker"
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'int' object has no attribute 'Name'
认识到这种错误是有帮助的。这意味着变量不是OREF
,但应该是OREF
。
- 创建
OREF
只有一种方法:使用返回OREF
的方法。返回OREF
的方法在对象类或其子类中定义。
下面的代码不会创建OREF
,而是创建一个看起来像OREF
的字符串:
TESTNAMESPACE>set testthis="4@Sample.Person"
>>> testthis="<iris.Sample.Person object at 0x000001A1E52FFD20>"
- 在
ObjectScript
中,可以通过编程确定变量是否包含OREF
。如果变量包含OREF
,函数$IsObject
返回1
(true
);否则返回0
(false
)。
注意:对于持久化类,像%OpenId()
这样的方法也会返回oref。
网友评论