Python Reflection - PullRequest
       3

Python Reflection

4 голосов
/ 16 апреля 2011

предположим, у нас много объектов в памяти.У каждого есть свой идентификатор.Как я могу перебрать память, чтобы найти конкретный объект, который сравнивается с каким-то идентификатором?Чтобы захватить его и использовать через getattr?

Ответы [ 4 ]

10 голосов
/ 16 апреля 2011

Вы должны поддерживать коллекцию этих объектов по мере их создания в атрибуте класса, а затем предоставлять метод класса для их извлечения.

Что-то вроде:

class Thing(object):
    all = {}

    def __init__(self, id, also, etc):
        self.id = id
        self.all[id] = self

    @classmethod
    def by_id(cls, id):
        return cls.all[id]
2 голосов
/ 16 апреля 2011

Вы можете запросить сборщик мусора обо всех существующих объектах и ​​пройтись по этой коллекции, чтобы найти то, что вы ищете, но это, вероятно, неправильно, если у вас нет особых причин для этого.

0 голосов
/ 18 апреля 2011

Прежде всего, вы ответили мне большое спасибо, что я думал на выходных так:

for ech in globals():
        if str(type(globals()[ech])).find('instance') != -1:
            if ( globals()[ech].__dict__.has_key('onoma')):
                print "%s, %s, %s"%( ech, globals()[ech].__dict__, id(globals()[ech]) )

, который выполнил работу, хотя я не знаю, хороший это или плохой подход(«онома» - греческое слово для названия).Я прочитал в документации Pyton о: _id2obj_dict = weakref.WeakValueDictionary () из слабых.И я тоже попробовал.Хороший подход и похож на Неда и Ninjagecko, я думаю.Но в таком случае, как я могу быть уверен, что объект полностью освобожден из памяти?

0 голосов
/ 16 апреля 2011

Вы можете сделать 'регистрацию' диктовкой, на которую подписаны все новые экземпляры, с отображением ID-> объектов:

registry = {}

class MyClass(object):
    def __init__(self, ...):
        id = ...
        registry[id] = self

MyClass.__all__ = registry

Это эквивалентно другому принятому решению (другое, однако, более «питонное»). Ранее я улучшил этот метод двумя способами: 1) вы можете создать собственный класс контейнера для реестра, который позволяет выполнять поиск не только по идентификаторам; 2) вы также можете создать метакласс, который автоматически добавляет код, но это может стать уродливым, если вам нужны метаклассы для чего-то другого.

изменить: поскольку другой ответ был приемлем, добавлены способы вычеркнуть шаблон проектирования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...