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

回答編集履歴

2

追加質問への回答

2021/03/29 13:22

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -22,4 +22,44 @@
22
22
  <class 'type'>
23
23
  >>> print(str.__class__)
24
24
  <class 'type'>
25
+ ```
26
+
27
+ 追加質問への回答です。
28
+
29
+ - "typeはクラスのクラス" とはどういうことでしょうか??
30
+
31
+ Pythonではすべてはオブジェクトです。
32
+ すべてのオブジェクトはクラスを持ちます。
33
+ 1.0という浮動小数のクラスはfloatであり、それを調べるためには、type(float)を使うか、1.0.__class__を使います。
34
+ type(float)はtypeというクラスです。
35
+
36
+ 詳しくは公式ドキュメントの[class type](https://docs.python.org/ja/3/library/functions.html?highlight=type#type)を読んでください。
37
+
38
+ - SignigKey()とSigningKeyの場合,前者がオブジェクト(インスタンス)で,SigningKeyがクラスということでしょうか??
39
+ はい。
40
+
41
+ - type(SigningKey) とやるとtype型が出るということでしょうか,
42
+ はい。
43
+
44
+ - "SigningKey().メソッド名"と書いていないのにもかかわらず,なぜ上のような使い方ができるのでしょうか??
45
+ generateはSigningKeyのクラスメソッドだからです。
46
+
47
+ クラスメソッドについては公式ドキュメントの[@classmethod](https://docs.python.org/ja/3/library/functions.html?highlight=classmethod#classmethod)に書いてありますが、あまりわかりやすくないですね。
48
+
49
+ 以下の例で理解してください。
50
+
51
+ ```python
52
+ >>> class C:
53
+ ... @classmethod
54
+ ... def hello(cls, name):
55
+ ... print(f'from {cls}: hello {name}')
56
+ ...
57
+ >>> C.hello('John')
58
+ from <class '__main__.C'>: hello John
59
+ >>> print(C.hello)
60
+ <bound method C.hello of <class '__main__.C'>>
61
+ >>> print(SigningKey.generate)
62
+ <bound method SigningKey.generate of <class 'ecdsa.keys.SigningKey'>>
63
+ >>> type(C.hello) is type(SigningKey.generate)
64
+ True
25
65
  ```

1

例を追加

2021/03/29 13:22

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -1,2 +1,25 @@
1
1
  直接には、SigningKeyのクラスがtypeであるという意味です。
2
- typeはクラスのクラスなので、SigningKeyがクラスであるという意味になります。
2
+ typeはクラスのクラスなので、SigningKeyがクラスであるという意味になります。
3
+
4
+ 以下を見て理解して下さい。
5
+
6
+ type(x)はx.__class__と同じになります。
7
+
8
+ ```python
9
+ >>> print(type(1.0))
10
+ <class 'float'>
11
+ >>> print(1.0.__class__)
12
+ <class 'float'>
13
+ >>> print(type('a'))
14
+ <class 'str'>
15
+ >>> print('a'.__class__)
16
+ <class 'str'>
17
+ >>> print(type(float))
18
+ <class 'type'>
19
+ >>> print(float.__class__)
20
+ <class 'type'>
21
+ >>> print(type(str))
22
+ <class 'type'>
23
+ >>> print(str.__class__)
24
+ <class 'type'>
25
+ ```