Код: Выделить всё
class MyClass:
pass
Как?
Более конкретно, я хочу различать объекты, где есть __dict__/
Код: Выделить всё
__slots__Я думаю, что в основном я хочу проверить, определяет ли тип некоторые пользовательские Py_tp_members (но не производные от __slots__ (см.)).
Некоторые общие сведения/идеи, которые могут оказаться полезными для ответа:
- обычно пуст или отсутствует.
Код: Выделить всё
functools.partial.__dict__ - существует только в том случае, если Python использует чистую реализацию Python, что обычно не так.
Код: Выделить всё
functools.partial.__slots__ - существует начиная с Python >=3.11 и возвращает __dict__ (и, возможно, __slots__), поэтому в случае собственного частичного он будет пустым или None . (Не уверен, что это действительно так. См. проблему CPython № 125094.)
Код: Выделить всё
functools.partial.__getstate__() - также не распространяется на func и co? Однако dir(functools.partial) делает это? Дополнительный вопрос: что встроенный каталог делает по-другому? Где находится точный код встроенного каталога, который охватывает этот случай? Я предполагаю, что он перебирает Py_tp_members, может быть, также Py_tp_methods?
Код: Выделить всё
functools.partial.__dir__(functools.partial) - Сначала я думал, что, возможно, __dictoffset__ дает мне какую-то подсказку, но это оказалось это неправильно.
- Встроенный каталог, вероятно, можно использовать в любом случае. Inspect.getmembers (или Inspect.getmembers_static) может рассказать мне то, что мне нужно знать.
Нам необходимо определить наш собственный хеш (не __hash__) для любого типа объекта стабильным способом (который хэш не меняется в разных версиях Python) и значимым образом (что хэш содержит все соответствующие состояния). До сих пор мы перебирали __getstate__() или __dict__/.
Код: Выделить всё
__slots__См. выпуск Sisyphus № 207, а также Sisyphus get_object_state и Sisyphus sis_hash_helper.
Подробнее здесь: https://stackoverflow.com/questions/790 ... -user-type