Как перехватить операции с помощью подклассов? - PullRequest
3 голосов
/ 31 октября 2011

Я работаю над Learning Python 4th Edition и в настоящее время я работаю над упражнениями для части VI книги.Упражнение, которое я сейчас выполняю, немного смущает меня, и я надеялся, что смогу получить небольшое руководство относительно того, как я могу его решить.

Вот подсказка, с которой я работаю.

Подклассы.Создайте подкласс MyList из упражнения 2 под названием MyListSub, который расширяет MyList для печати сообщения на стандартный вывод перед вызовом каждой перегруженной операции и подсчитывает количество вызовов.MyListSub должен наследовать поведение основного метода от MyList.Добавление последовательности в MyListSub должно напечатать сообщение, увеличить счетчик для вызовов + и выполнить метод суперкласса.Кроме того, представьте новый метод, который выводит счетчики операций на стандартный вывод, и поэкспериментируйте с вашим классом.Ваши счетчики считают вызовы за экземпляр или за класс (для всех экземпляров класса)?Как бы вы запрограммировали другой вариант)?(Подсказка: это зависит от того, какому объекту назначены члены подсчета: члены класса являются общими для экземпляров, но собственные члены являются данными для каждого экземпляра.)

Так что часть, в которой я действительно заинтересованпрямо сейчас

Создайте подкласс MyList из упражнения 2 под названием MyListSub, который расширяет MyList для вывода сообщения на стандартный вывод перед вызовом каждой перегруженной операции и подсчитывает количество вызовов.

Я вижу хорошее применение СУХОЙ здесь, которая убьет всех моих птиц одним камнем.Но я просто не знаю, как это реализовать.Я знаю, что мне нужно реализовать какой-то метод, который перехватывает операции, увеличивает счетчик и печатает сообщение.Но я не знаю, как лучше всего это сделать.Моя основная идея - что-то вроде

def count_ops(self, op_count):
    # intercept calls to operator overloading methods
    op_count += 1
    print 'Number of calls to operator {0}: {1}'.format(oper, op_count)

(Примечание: это не код, который я написал, это пограничный псевдокод, чтобы выделить то, что я хочу сделать.)

Могу ли яполучить небольшую помощь здесь?Пожалуйста, не дайте мне ответ прямо, я хочу понять это, и подсказки идут намного дальше, чем ответы.:)

Ответы [ 2 ]

1 голос
/ 31 октября 2011

Ваши перегруженные методы делают что-то еще, кроме подсчета вызовов?Другими словами, вы должны их написать в любом случае?Если да, вы можете использовать декораторы или просто отдельную функцию, подобную той, что есть, и вызывать ее из каждого метода.

Если единственная перегрузка, необходимая в подклассе, - это подсчет, который вы можете посмотреть в __getattribute__.Имейте в виду, что это немного сложно, и вам понадобится тщательное понимание этого, прежде чем вы когда-либо использовали его в рабочем коде.Другие варианты включают декоратор класса или метакласс для переноса каждого из методов, которые вам интересны.

1 голос
/ 31 октября 2011

Совет:

def count(cls):
    for attr in (attr for attr in dir(cls) if not attr.startswith('_')):
        method = getattr(cls,attr)
        if callable(method):
            setattr(cls,attr,func_count(method,attr))
    return cls
...