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

回答編集履歴

3

補足2

2017/10/12 13:53

投稿

karamarimo
karamarimo

スコア2555

answer CHANGED
@@ -9,4 +9,15 @@
9
9
  return 1
10
10
 
11
11
  Test._num = Test._set_num()
12
- ```
12
+ ```
13
+
14
+ ---
15
+ クラスの定義内でクラスメソッドにアクセスすることはできません。
16
+ 定義したあとにメンバーを編集することはできます。
17
+
18
+ `def __set_num(cls):`とアンダースコアを2つ先頭につけると、[__name mangling__](https://docs.python.org/3/tutorial/classes.html#private-variables)により外からアクセスしにくくなるように自動的に名前が変えられます。
19
+
20
+ なので外からクラスメソッドをアクセスできるように上のコードではアンダースコアを1つにしました。
21
+
22
+ 参考
23
+ [https://stackoverflow.com/questions/13900515/how-can-i-access-a-classmethod-from-inside-a-class-in-python](https://stackoverflow.com/questions/13900515/how-can-i-access-a-classmethod-from-inside-a-class-in-python)

2

修正

2017/10/12 13:53

投稿

karamarimo
karamarimo

スコア2555

answer CHANGED
@@ -5,8 +5,8 @@
5
5
  ```lang-python
6
6
  class Test:
7
7
  @classmethod
8
- def __set_num(cls):
8
+ def _set_num(cls):
9
9
  return 1
10
10
 
11
- Test._num = Test.__set_num()
11
+ Test._num = Test._set_num()
12
12
  ```

1

補足

2017/10/12 13:46

投稿

karamarimo
karamarimo

スコア2555

answer CHANGED
@@ -1,1 +1,12 @@
1
- `cls`は`__set_num`の引数であって、その外では定義されていないので当然使えません。
1
+ `cls`は`__set_num`の引数であって、その外では定義されていないので当然使えません。
2
+
3
+ 質問者さんがやりたいことがいまひとつ分からないですが、こうすればエラーはでないです。
4
+
5
+ ```lang-python
6
+ class Test:
7
+ @classmethod
8
+ def __set_num(cls):
9
+ return 1
10
+
11
+ Test._num = Test.__set_num()
12
+ ```