mirror of https://github.com/python/cpython
gh-113157 gh-89519: Fix method descriptors (gh-113233)
Restore behaviors before classmethod descriptor chaining was introduced.
This commit is contained in:
parent
6a5b4736e5
commit
d058eaeed4
|
@ -5004,6 +5004,21 @@ class ClassPropertiesAndMethods(unittest.TestCase):
|
||||||
gc.collect()
|
gc.collect()
|
||||||
self.assertEqual(Parent.__subclasses__(), [])
|
self.assertEqual(Parent.__subclasses__(), [])
|
||||||
|
|
||||||
|
def test_instance_method_get_behavior(self):
|
||||||
|
# test case for gh-113157
|
||||||
|
|
||||||
|
class A:
|
||||||
|
def meth(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
class B:
|
||||||
|
pass
|
||||||
|
|
||||||
|
a = A()
|
||||||
|
b = B()
|
||||||
|
b.meth = a.meth.__get__(b, B)
|
||||||
|
self.assertEqual(b.meth(), a)
|
||||||
|
|
||||||
def test_attr_raise_through_property(self):
|
def test_attr_raise_through_property(self):
|
||||||
# test case for gh-103272
|
# test case for gh-103272
|
||||||
class A:
|
class A:
|
||||||
|
|
|
@ -319,6 +319,13 @@ method_traverse(PyMethodObject *im, visitproc visit, void *arg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
method_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
|
||||||
|
{
|
||||||
|
Py_INCREF(meth);
|
||||||
|
return meth;
|
||||||
|
}
|
||||||
|
|
||||||
PyTypeObject PyMethod_Type = {
|
PyTypeObject PyMethod_Type = {
|
||||||
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
||||||
.tp_name = "method",
|
.tp_name = "method",
|
||||||
|
@ -339,6 +346,7 @@ PyTypeObject PyMethod_Type = {
|
||||||
.tp_methods = method_methods,
|
.tp_methods = method_methods,
|
||||||
.tp_members = method_memberlist,
|
.tp_members = method_memberlist,
|
||||||
.tp_getset = method_getset,
|
.tp_getset = method_getset,
|
||||||
|
.tp_descr_get = method_descr_get,
|
||||||
.tp_new = method_new,
|
.tp_new = method_new,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue