teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

説明のまずいぶぶんを修正

2019/06/21 16:12

投稿

hayataka2049
hayataka2049

スコア30939

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