From 8b7a9a38c66aff5633255b63be639ee8592f180b Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 14 Apr 2003 22:01:58 +0000 Subject: The date class is now properly subclassable. (SF bug #720908) (This is only the tip of the iceberg; the time and datetime classes need the same treatment.) --- Lib/test/test_datetime.py | 6 ++++++ Misc/NEWS | 2 ++ Modules/datetimemodule.c | 13 ++++++++----- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py index 9532a2a..b86286b 100644 --- a/Lib/test/test_datetime.py +++ b/Lib/test/test_datetime.py @@ -479,6 +479,12 @@ class TestDateOnly(unittest.TestCase): dt2 = dt - delta self.assertEqual(dt2, dt - days) + def test_subclass_date(self): + class C(date): + theAnswer = 42 + dt = C(2003, 4, 14) + self.assertEqual(dt.__class__, C) + class TestDate(HarmlessMixedComparison): # Tests here should pass for both dates and datetimes, except for a # few tests that TestDateTime overrides. diff --git a/Misc/NEWS b/Misc/NEWS index 438e619..4f24edc 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -330,6 +330,8 @@ Extension modules - datetime changes: + The date class is now properly subclassable. (SF bug #720908) + The datetime and datetimetz classes have been collapsed into a single datetime class, and likewise the time and timetz classes into a single time class. Previously, a datetimetz object with tzinfo=None acted diff --git a/Modules/datetimemodule.c b/Modules/datetimemodule.c index e514a54..88a076b 100644 --- a/Modules/datetimemodule.c +++ b/Modules/datetimemodule.c @@ -1291,16 +1291,19 @@ set_date_fields(PyDateTime_Date *self, int y, int m, int d) /* Create a date instance with no range checking. */ static PyObject * -new_date(int year, int month, int day) +new_date_ex(int year, int month, int day, PyTypeObject *type) { PyDateTime_Date *self; - self = PyObject_New(PyDateTime_Date, &PyDateTime_DateType); + self = (PyDateTime_Date *) (type->tp_alloc(type, 0)); if (self != NULL) set_date_fields(self, year, month, day); return (PyObject *) self; } +#define new_date(year, month, day) \ + (new_date_ex(year, month, day, &PyDateTime_DateType)) + /* Create a datetime instance with no range checking. */ static PyObject * new_datetime(int year, int month, int day, int hour, int minute, @@ -2168,7 +2171,7 @@ date_new(PyTypeObject *type, PyObject *args, PyObject *kw) { PyDateTime_Date *me; - me = PyObject_New(PyDateTime_Date, &PyDateTime_DateType); + me = PyObject_New(PyDateTime_Date, type); if (me != NULL) { char *pdata = PyString_AS_STRING(state); memcpy(me->data, pdata, _PyDateTime_DATE_DATASIZE); @@ -2181,7 +2184,7 @@ date_new(PyTypeObject *type, PyObject *args, PyObject *kw) &year, &month, &day)) { if (check_date_args(year, month, day) < 0) return NULL; - self = new_date(year, month, day); + self = new_date_ex(year, month, day, type); } return self; } @@ -2632,7 +2635,7 @@ static PyTypeObject PyDateTime_DateType = { "datetime.date", /* tp_name */ sizeof(PyDateTime_Date), /* tp_basicsize */ 0, /* tp_itemsize */ - (destructor)PyObject_Del, /* tp_dealloc */ + 0, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ -- cgit v0.12