Я новичок в Python, и просто использовал какой-то код от других, который действительно меня запутал. Он использует одно и то же имя класса в одном файле, как показано ниже:
class _LSA_UNICODE_STRING(ctypes.Structure):
_fields_ = [
("Length", USHORT),
("MaximumLength", USHORT),
("Buffer", DWORD),
]
INITIAL_LSA_UNICODE_STRING = _LSA_UNICODE_STRING
class _LSA_UNICODE_STRING(INITIAL_LSA_UNICODE_STRING):
@property
def str(self):
if not self.Length:
return ""
if getattr(self, "_target", None) is not None:
raw_data = self._target.read_memory(self.Buffer, self.Length)
return raw_data.decode("utf16")
size = self.Length // 2
return (ctypes.c_wchar * size).from_address(self.Buffer)[:]
def __repr__(self):
return """<{0} "{1}" at {2}>""".format(
type(self).__name__, self.str, hex(id(self))
)
def __sprint__(self):
try:
return self.__repr__()
except TypeError as e:
return """<{0} len={1} maxlen={2} buffer={3}>""".format(
type(self).__name__, self.Length, self.MaximumLength, self.Buffer
)
Я пытался удалить подчеркивание _
перед именем класса, pylint
пожаловался class already defined
, но это может сработать. Однако если с _
, pylint
не будет жаловаться, то это похоже на ошибку pylint
или _
имеет какое-то особое значение в Python?
В части использования это выглядит так :
handle_type = _LSA_UNICODE_STRING.from_buffer_copy(ctypes.c_buffer(512)).str
Поскольку первый _LSA_UNICODE_STRING
имеет параметр ctypes.Structure
, кажется, что from_buffer_copy
взят из ctypes
, тогда возвращаемый результат должен быть первым _LSA_UNICODE_STRING
, но это с последующим методом .str
, который находится во втором определении _LSA_UNICODE_STRING
, как это могло произойти? Есть ли профессиональное название для этого вида наследования и перегрузки в Python? Я много искал, но не могу найти хорошего объяснения. Извините за мое невежество и желаю вашей профессиональной помощи. Спасибо!
Оригинальный код от здесь .