]> granicus.if.org Git - python/commitdiff
The date class is now properly subclassable. (SF bug #720908)
authorGuido van Rossum <guido@python.org>
Mon, 14 Apr 2003 22:01:58 +0000 (22:01 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 14 Apr 2003 22:01:58 +0000 (22:01 +0000)
(This is only the tip of the iceberg; the time and datetime classes
need the same treatment.)

Lib/test/test_datetime.py
Misc/NEWS
Modules/datetimemodule.c

index 9532a2a7838951e4baf6bc5e3fc6013cc7eef8d6..b86286bbff839e20e7b450720a208694e3ee40cd 100644 (file)
@@ -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.
index 438e619e6b01613e88f3cbe7cb3075bf89f1f779..4f24edcb3d68d90b903004d25c85954a39e334e7 100644 (file)
--- 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
index e514a5427f43c9c006a0136bd17528b0f4473388..88a076b6677f3312965b5b8e93ad1adcdbc881c0 100644 (file)
@@ -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 */