Skip to content

Commit e1dbaf9

Browse files
committed
allow Python to overwrite .NET methods
1 parent ee0ab7f commit e1dbaf9

File tree

3 files changed

+7
-42
lines changed

3 files changed

+7
-42
lines changed

src/runtime/extensiontype.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,6 @@ public static int tp_setattro(IntPtr ob, IntPtr key, IntPtr val)
8787
return -1;
8888
}
8989

90-
91-
/// <summary>
92-
/// Default __set__ implementation - this prevents descriptor instances
93-
/// being silently replaced in a type __dict__ by default __setattr__.
94-
/// </summary>
95-
public static int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val)
96-
{
97-
Exceptions.SetError(Exceptions.AttributeError, "attribute is read-only");
98-
return -1;
99-
}
100-
101-
10290
public static void tp_dealloc(IntPtr ob)
10391
{
10492
// Clean up a Python instance of this extension type. This

src/testing/methodtest.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public MethodTest()
1414
{
1515
}
1616

17+
public string OverwritableMethod() => "overwritable";
18+
1719
public string PublicMethod()
1820
{
1921
return "public";

tests/test_method.py

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,12 @@
66
import pytest
77
from Python.Test import MethodTest
88

9+
def test_instance_method_overwritable():
10+
"""Test instance method overwriting."""
911

10-
def test_instance_method_descriptor():
11-
"""Test instance method descriptor behavior."""
12-
13-
with pytest.raises(AttributeError):
14-
MethodTest().PublicMethod = 0
15-
16-
with pytest.raises(AttributeError):
17-
MethodTest.PublicMethod = 0
18-
19-
with pytest.raises(AttributeError):
20-
del MethodTest().PublicMethod
21-
22-
with pytest.raises(AttributeError):
23-
del MethodTest.PublicMethod
24-
25-
26-
def test_static_method_descriptor():
27-
"""Test static method descriptor behavior."""
28-
29-
with pytest.raises(AttributeError):
30-
MethodTest().PublicStaticMethod = 0
31-
32-
with pytest.raises(AttributeError):
33-
MethodTest.PublicStaticMethod = 0
34-
35-
with pytest.raises(AttributeError):
36-
del MethodTest().PublicStaticMethod
37-
38-
with pytest.raises(AttributeError):
39-
del MethodTest.PublicStaticMethod
12+
ob = MethodTest()
13+
ob.OverwritableMethod = lambda: "overwritten"
14+
assert ob.OverwritableMethod() == "overwritten"
4015

4116

4217
def test_public_instance_method():

0 commit comments

Comments
 (0)