我正在使用Python2.5&以下代码产生2个错误。 任何人都可以帮助我吗?
class EXCEPTION_RECORD(Structure):
_fields_ = [
("ExceptionCode", DWORD),
("ExceptionFlags", DWORD),
("ExceptionRecord", POINTER(EXCEPTION_RECORD)),
("ExceptionAddress", LPVOID),
("NumberParameters", DWORD),
("ExceptionInformation", ULONG_PTR * EXCEPTION_MAXIMUM_PARAMETERS)]
Python错误:
Traceback (most recent call last):
File "E:\Python25\my_debugger_defines.py", line 70, in <module>
class EXCEPTION_RECORD(Structure):
File "E:\Python25\my_debugger_defines.py", line 74, in EXCEPTION_RECORD
("ExceptionRecord", POINTER(EXCEPTION_RECORD)),
NameError: name 'EXCEPTION_RECORD' is not defined
Microsoft文档:
The EXCEPTION_RECORD structure describes an exception.
typedef struct _EXCEPTION_RECORD { // exr
DWORD ExceptionCode;
DWORD ExceptionFlags;
struct _EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress;
DWORD NumberParameters;
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD;
提前致谢
答案 0 :(得分:2)
显然,在定义类时不能引用类类型,例如:
>>> class C:
f = C
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
class C:
File "<pyshell#17>", line 2, in C
f = C
NameError: name 'C' is not defined
但是,你可以通过这样做来解决这个问题:
>>> class C:
pass
>>> C.f = C
我会按如下方式重新编写代码:
class EXCEPTION_RECORD(Structure):
pass
EXCEPTION_RECORD._fields_ = [
("ExceptionCode", DWORD),
("ExceptionFlags", DWORD),
("ExceptionRecord", POINTER(EXCEPTION_RECORD)),
("ExceptionAddress", LPVOID),
("NumberParameters", DWORD),
("ExceptionInformation", ULONG_PTR * EXCEPTION_MAXIMUM_PARAMETERS)]
答案 1 :(得分:2)
看起来你已经完成了from ctypes import *
(糟糕的做法,因为人们可以猜测所有这些标识符,例如DWORD
实际来自哪里! - )但错过了{{} {3}}:
可以定义字段 类之后的类变量 定义结构的语句 子类,这允许创建数据 直接或间接的类型 引用自己:
class List(Structure):
pass
List._fields_ = [("pnext", POINTER(List)),
...
]
fields 类变量必须, 但是,在类型之前定义 首先使用(创建一个实例, 在其上调用sizeof(),依此类推)。 稍后分配到字段 类变量会引发一个 AttributeError的。
因此,只需将这些文档应用于您的代码,您需要将该代码更改为:
class EXCEPTION_RECORD(Structure):
pass
EXCEPTION_RECORD._fields_ = [
("ExceptionCode", DWORD),
("ExceptionFlags", DWORD),
("ExceptionRecord", POINTER(EXCEPTION_RECORD)),
("ExceptionAddress", LPVOID),
("NumberParameters", DWORD),
("ExceptionInformation", ULONG_PTR * EXCEPTION_MAXIMUM_PARAMETERS)]
答案 2 :(得分:0)
类可以使用__new__
或__init__
方法引用自身。
class Test(object):
def __new__(cls):
inst = object.__new__(cls)
inst.me = Test
return inst
或:
class Test(object):
def __init__(self):
super(Test, self).__init__()
self.me = Test
或者,如果您想真正想要的话,可以使用__metaclass__
。