回答編集履歴
1
説明のまずいぶぶんを修正
answer
CHANGED
@@ -1,7 +1,25 @@
|
|
1
1
|
> メタクラスは typeを明記して継承しなければいけないそうですががなぜですか。objectを明記して継承させる場合や、何も明記しない場合とどこが違うのでしょうか。
|
2
2
|
*明記... class A(type): の(type)のこと
|
3
3
|
|
4
|
-
よくある普通のクラスは`type`のインスタンスです。`type`を継承
|
4
|
+
よくある普通のクラスは`type`のインスタンスです。`type`を継承するとメタクラスが作れます。`class B(metaclass=A):`のような記述は、`B`クラスそのものを`A`のインスタンスとして作りますよ、ということを表します。
|
5
|
+
```python
|
6
|
+
>>> class Hoge:
|
7
|
+
... pass
|
8
|
+
...
|
9
|
+
>>> class Fuga(type):
|
10
|
+
... pass
|
11
|
+
...
|
12
|
+
>>> class Piyo(metaclass=Fuga):
|
13
|
+
... pass
|
14
|
+
...
|
15
|
+
>>> type(Hoge)
|
16
|
+
<class 'type'>
|
17
|
+
>>> type(Fuga)
|
18
|
+
<class 'type'>
|
19
|
+
>>> type(Piyo)
|
20
|
+
<class '__main__.Fuga'>
|
21
|
+
```
|
22
|
+
`Piyo`だけ型が違いますね。これがメタクラスの機能です。
|
5
23
|
|
6
24
|
> type型とobject型の違い(どちらがどちらのスーパークラスか)もよくわかりません。全ての型がtype型のサブクラスだということは知っています。
|
7
25
|
|
@@ -75,7 +93,7 @@
|
|
75
93
|
"""
|
76
94
|
```
|
77
95
|
|
78
|
-
こういう操作を可能にする、ということなのです。どの段階で何を受け取るのかを注意してください。
|
96
|
+
こういう操作を可能にする(ここでは`B`の**定義時**に引数を受け取っている)、ということなのです。どの段階で何を受け取るのかを注意してください。
|
79
97
|
|
80
98
|
質問文のやりたいことはインスタンスをいじりたいということなので、たぶん普通のクラスの継承でやった方がいいのですが。どうしてもやるなら、
|
81
99
|
|