回答編集履歴

4

文言変更

2021/12/11 22:09

投稿

actorbug
actorbug

スコア2431

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- ただし、該当のクラスが組み込み型やC拡張モジュールで定義された型など特殊なものだとできない。
33
+ ただし、該当のクラスが特殊な型(組み込み型やC拡張モジュールで定義された型など)だとできない。
34
34
 
35
35
  (こちらの記事の方法であれば可能: [[Python] build-in objectに独自のメソッドを追加する禁断の果実](https://e-tec-memo.herokuapp.com/article/283/))
36
36
 

3

multipledispatch追記、コメントで追加した内容のマージ

2021/12/11 22:09

投稿

actorbug
actorbug

スコア2431

test CHANGED
@@ -30,7 +30,9 @@
30
30
 
31
31
 
32
32
 
33
- ただし、該当のクラスが組み込み型など特殊なものだとできない。
33
+ ただし、該当のクラスが組み込み型やC拡張モジュールで定義された型など特殊なものだとできない。
34
+
35
+ (こちらの記事の方法であれば可能: [[Python] build-in objectに独自のメソッドを追加する禁断の果実](https://e-tec-memo.herokuapp.com/article/283/))
34
36
 
35
37
  あと、事前に別名で関数として定義しなければならないので、名前付けの問題は残る。
36
38
 
@@ -40,7 +42,7 @@
40
42
 
41
43
 
42
44
 
43
- あと、[functools.singledispatch](https://docs.python.org/ja/3/library/functools.html#functools.singledispatch)を使う方法もある。
45
+ 他に、[functools.singledispatch](https://docs.python.org/ja/3/library/functools.html#functools.singledispatch)を使う方法もある。
44
46
 
45
47
  ```python
46
48
 
@@ -111,3 +113,47 @@
111
113
  func2(b1, b2)
112
114
 
113
115
  ```
116
+
117
+
118
+
119
+ 先頭引数以外の型も見たいのであれば、[multipledispatch](https://github.com/mrocklin/multipledispatch)をインストールすれば可能。実行例は上と同じ。
120
+
121
+ ```python
122
+
123
+ from multipledispatch import dispatch
124
+
125
+
126
+
127
+ @dispatch()
128
+
129
+ def func1(a1: modulea.TypeA, a2: modulea.TypeA) -> modulea.TypeA:
130
+
131
+ a = a1 + a2
132
+
133
+ return a
134
+
135
+ @dispatch()
136
+
137
+ def func1(b1: moduleb.TypeB, b2: moduleb.TypeB) -> moduleb.TypeB:
138
+
139
+ b = b1 + b2
140
+
141
+ return b
142
+
143
+ @dispatch()
144
+
145
+ def func2(a1: modulea.TypeA, a2: modulea.TypeA) -> modulea.TypeA:
146
+
147
+ a = a1 - a2
148
+
149
+ return a
150
+
151
+ @dispatch()
152
+
153
+ def func2(b: moduleb.TypeB, b2: moduleb.TypeB) -> moduleb.TypeB:
154
+
155
+ b = b1 - b2
156
+
157
+ return b
158
+
159
+ ```

2

注意追加

2021/12/11 21:54

投稿

actorbug
actorbug

スコア2431

test CHANGED
@@ -98,7 +98,7 @@
98
98
 
99
99
 
100
100
 
101
- とすれば、このように書ける。
101
+ とすれば、このように書ける。(先頭引数の型しか見ていないので注意)
102
102
 
103
103
  ```python
104
104
 

1

方法追加

2021/12/11 09:46

投稿

actorbug
actorbug

スコア2431

test CHANGED
@@ -35,3 +35,79 @@
35
35
  あと、事前に別名で関数として定義しなければならないので、名前付けの問題は残る。
36
36
 
37
37
  (直接ラムダ式を代入することもできるけど、ラムダ式だとできることが限られる)
38
+
39
+
40
+
41
+
42
+
43
+ あと、[functools.singledispatch](https://docs.python.org/ja/3/library/functools.html#functools.singledispatch)を使う方法もある。
44
+
45
+ ```python
46
+
47
+ from functools import singledispatch
48
+
49
+
50
+
51
+ @singledispatch
52
+
53
+ def func1(arg1, arg2):
54
+
55
+ pass
56
+
57
+ @func1.register
58
+
59
+ def _(a1: modulea.TypeA, a2: modulea.TypeA) -> modulea.TypeA:
60
+
61
+ a = a1 + a2
62
+
63
+ return a
64
+
65
+ @func1.register
66
+
67
+ def _(b1: moduleb.TypeB, b2: moduleb.TypeB) -> moduleb.TypeB:
68
+
69
+ b = b1 + b2
70
+
71
+ return b
72
+
73
+
74
+
75
+ @singledispatch
76
+
77
+ def func2(arg1, arg2):
78
+
79
+ pass
80
+
81
+ @func2.register
82
+
83
+ def _(a1: modulea.TypeA, a2: modulea.TypeA) -> modulea.TypeA:
84
+
85
+ a = a1 - a2
86
+
87
+ return a
88
+
89
+ @func2.register
90
+
91
+ def _(b: moduleb.TypeB, b2: moduleb.TypeB) -> moduleb.TypeB:
92
+
93
+ b = b1 - b2
94
+
95
+ return b
96
+
97
+ ```
98
+
99
+
100
+
101
+ とすれば、このように書ける。
102
+
103
+ ```python
104
+
105
+ func1(a1, a2)
106
+
107
+ func1(b1, b2)
108
+
109
+ func2(a1, a2)
110
+
111
+ func2(b1, b2)
112
+
113
+ ```