Я обеспечил набор ссылок ниже, которые отвечают на Ваш вопрос более подробно и более точно, чем я могу когда-либо надеяться. Я однако дам ответ на Ваш вопрос в моих собственных словах также, чтобы сэкономить Вам некоторое время. Я помещу его в точки -
__mro__
атрибут, который хранит порядок разрешения метода того конкретного экземпляра. __init__
) в классах в MRO, после того, как класс определил как первый аргумент (в этом случае классы после DC). Объяснение Вашего примера
MRO: D,B,C,A,object
super(D, self).__init__()
называют. isinstance (сам, D) => Верный Поиск следующий метод в MRO в классах направо от D.
B.__init__
найденный и названный
B.__init__
вызовы super(B, self).__init__()
.
isinstance (сам, B) => Ложь
isinstance (сам, D) => Верный
Таким образом, MRO является тем же, но поиск продолжается направо от B, т.е. C, A, объект ищется один за другим. Следующее __init__
найденный называют.
И т. д. и т. п.
объяснение супер
http://www.python.org/download/releases/2.2.3/descrintro/#cooperation
Вещи наблюдать за при использовании супер
http://fuhm.net/super-harmful/
Python Алгоритм MRO:
http://www.python.org/download/releases/2.3/mro/
документы super:
http://docs.python.org/library/functions.html
низ этой страницы имеет хороший раздел по супер:
http://docstore.mik.ua/orelly/other/python/0596001886_pythonian-chp-5-sect-2.html
я надеюсь, что это помогает разрешить его.
Вам необходимо учитывать экспоненциальный Кривая затухания просмотров, что-то похожее на эту - http://en.wikipedia.org/wiki/Exponential_decay
Нам нужна площадь под кривой до желаемого времени (в днях).
Если вычислите, и получите результат
Views = V/λ[1 - e^(-λt)]
t is (дата создания - сегодняшняя дата - 1)
V - количество просмотров, которое у нас есть
λ может быть 2ln2 / T или 1,4 / T
T может быть основным временем жизни, например, 5 или 7 дней. Давайте возьмем это 5.
Мы делаем много предположений здесь из-за динамической природы SO.
Чтобы имитировать длинные хвосты, просто введите константу. Или используйте логарифмическую функцию.
your_formula(delta_t) + C
1 / (1 + log(1 + delta_t))
(коэффициенты опущены)
Я подумал об этом методе для оценки хвоста:
для списка тегов, для каждого вопроса в этих тегах дать 1-й месяц после даты создания 80% View_Count дать 2-й месяц после creation_date 10% View_Count разделить 10% поровну между оставшимися месяцами до сегодняшнего дня
, конечно, 80%, 10% - это просто мой выбор, их можно рассчитать более точно на основе реальных данных. Также со второго месяца 10% могут быть отменены. Вся эта логика находится в: CASE WHEN diff ...
часть.
вы получаете приблизительное количество просмотров / вопрос / месяц
, тогда все, что вам нужно сделать, это сумма просмотров в месяц, и если вы хотите, чтобы окно времени добавляло условие для месяца
Я создал хранимую процедуру, которая это можно сделать, но сначала вам нужно создать временную таблицу #tags (Tag_name), в которую вы поместите нужные теги.
CREATE PROCEDURE GetTagViews @startDate datetime, @endDate datetime
As
IF exists (SELECT null FROM sysobjects WHERE name = '#months' and type = 'U')
DROP TABLE #MONTHS
CREATE TABLE #MONTHS
(
month datetime
)
DECLARE @currMonth datetime
SELECT @currMonth = MIN(Creation_Date) FROM Questions
-- Populate #MONTHS with all the months from the oldest
-- question creation_date to Today
WHILE @currMonth < getdate()
BEGIN
-- insert date starting at the beginning og the month
INSERT INTO #MONTHS select @currMonth - day(@currMonth) + 1
SELECT @currMonth = dateadd(m, 1, @currMonth) -- advance 1 month
END
SELECT YEAR(month) y, MONTH(month) m, SUM(curr_month_views) Views FROM (
SELECT Q1.month, Q1.diff, round(
CASE WHEN diff = dmin and diff = dmax THEN View_Count
WHEN diff = dmin and diff < dmax THEN 0.8*View_Count
WHEN diff = dmin+1 and diff < dmax THEN 0.1*View_Count
WHEN diff = dmin+1 and diff = dmax THEN 0.2*View_Count
WHEN diff >= dmin+2 THEN 0.1/(dmax - (dmin+2) + 1)*View_Count
ELSE 0
END, 0) curr_month_views
FROM (
SELECT Q.question_id, m.month,
DATEDIFF(m, Q.Creation_Date, m.month) diff,
Q.View_Count, dmin, dmax
FROM Questions Q,
#MONTHS m,
(SELECT MIN(DATEDIFF(m, Q.Creation_Date, m.month)) [dmin],
MAX(DATEDIFF(m, Q.Creation_Date, m.month)) [dmax]
FROM Questions Q,#MONTHS m
WHERE DATEDIFF(m, Q.Creation_Date, m.month) >= 0) MINMAX
) Q1 join QuestionTags QT on Q1.question_id = QT.question_id
join #tags on #tags.Tag_Name = QT.Tag_Name
) b WHERE month >= @startDate - day(@startDate) + 1
AND month <= @enddate - day(@enddate) + 1
GROUP BY Year(month), Month(month)
ORDER BY 1, 2
Если я запущу эту процедуру со следующими данными:
Question_Id View_Count Creation_Date tag_name
----------- ----------- ------------------------------ ----------
0 42 2009-09-10 00:00:00.000 sql
1 326 2008-08-04 00:00:00.000 sql
2 377 2008-08-04 00:00:00.000 sql
3 568 2008-08-03 00:00:00.000 sql
4 839 2008-08-01 00:00:00.000 sql
5 228 2009-03-01 00:00:00.000 sql
6 178 2009-03-11 00:00:00.000 sql
7 348 2009-08-11 00:00:00.000 c#
заполните #tags с помощью 'sql'
GetTagViews '20090501', '20091001'
y m Views
----------- ----------- ---------------
2009 5 21.000000000000
2009 6 21.000000000000
2009 7 21.000000000000
2009 8 21.000000000000
2009 9 55.000000000000
заполнить # теги с помощью 'c #'
GetTagViews '20090501', '20091001'
y m Views
----------- ----------- ----------------------------------------
2009 5 .000000000000
2009 6 .000000000000
2009 7 .000000000000
2009 8 278.000000000000
2009 9 35.000000000000
заполнить # теги как 'sql', так и 'c #'
GetTagViews '20090501', '20091001'
y m Views
----------- ----------- ----------------
2009 5 21.000000000000
2009 6 21.000000000000
2009 7 21.000000000000
2009 8 299.000000000000
2009 9 90.000000000000
(вы видите этот пик для (sql,