質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1230閲覧

Classメソッドの利用方法

yu__

総合スコア108

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/02/25 07:32

classの利用方法

classはclass内に関数を定義することによって、その関数をメソッドとして利用するための型で
あることを理解しました。
また、そのメソッドとリストなどのデータを一緒にしたものをインスタンスと呼んでるという理解を
しています。
そこでclassを今以上に理解するために以下のコードを入力し実行しました。(以下のサイトを参考にさせていただきました)
https://www.sejuku.net/blog/72161

python

1class Calc: 2 def __init__(self, a, b): 3 self.a = a 4 self.b = b 5 6 def Sum(self): 7 self.sum = self.a + self.b 8 return self.sum 9 10ins = Calc(2, 3) 11print(ins.Sum())

結果

5

私の理解ですと__init__()なる関数は最初に使うというルールを持っている関数であるみたいなのは分かるのですが、ここで使われているselfが分かりません。
このselfを適当な引数として考えてもその次の行のself.a = aが分かりません。
しかしとりあえず上は飲み込んで自分になりに勉強のために以下にコードを書いてみました。

python

1class SUM: 2 def _init__(self, a): 3 self.a = a 4 def SUm(self): 5 self.sum = sum(self.a) #sumは組み込み関数です。 6 return self.sum 7 8a = [1,1,1,2,2,3,4,5,6,6,6,7] 9 10sum_rensyu = SUM(a) 11print(sum_rensyu.SUm())

結果

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-81-dcf06b7a51bc> in <module> 8 xxx = [1,1,1,2,2,3,4,5,6,6,6,7] 9 ---> 10 sum_rensyu = SUM(xxx) 11 print(sum_rensyu.SUm()) TypeError: object() takes no parameters

参考にさせていただいたコードとおぼ同じコードを書いたにも関わらず実行結果がエラーになってしまいます。
初学者かつ理解力も乏しいのでclassの概念ももし間違っていたらそこの概念から教えて頂けると恐縮です。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

コードが動かない原因は__init__と書くべきところに_init__と書いているからです。

以下のコードで正しく動きます。

class SUM: def __init__(self, a): self.a = a def SUm(self): self.sum = sum(self.a) #sumは組み込み関数です。 return self.sum a = [1,1,1,2,2,3,4,5,6,6,6,7] sum_rensyu = SUM(a) print(sum_rensyu.SUm()) # => 44

selfについてですが、作成したクラスからインスタンス自身だと考えるとわかりやすいかもしれないです。

ここらへんはこちらの質問が参考になるとおもいます。
Python 3.x - python3 「self」とは何なのでしょうか?|teratail

ちなみにタイトルにClassメソッド書いてありますが、クラスメソッドというと別の種類のクラスを指す言葉になってしまいます。この場合はクラスのメソッドという表現のほうがいいかもしれないです。

クラスメソッドとスタティックメソッドについて - Qiita

投稿2019/02/25 09:30

redshoga

総合スコア196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

__init__と書くべきところが、_init__になっています。

また、そのメソッドとリストなどのデータを一緒にしたものをインスタンスと呼んでるという理解を

しています。

データがインスタンスで、インスタンスとメソッドを合わせた物がクラスですかね。

インスタンスからメソッドを起動する事になる(例:sum_rensyu.SUm())のですが、メソッドを起動しろと言う命令(メッセージ)を受け取るインスタンスという意味で、そのインスタンスをレシーバーと言います。selfはレシーバーを指します。

aaa.SUm()なら、selfaaaだし、xxx.SUm()ならselfxxxです。

投稿2019/02/25 09:22

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

python

1 def _init__(self, a):

前側のアンダーバーが一個足りません。これだと__init__ではなく_init__を定義したことになり、__init__は特に定義されないので、すべてのクラスの基底クラスであるobject型の__init__がコンストラクタとして用いられます。結果、TypeError: object() takes no parametersとなります。


あとはどういうスタイルで回答するか迷いましたが、一行ずつ質問文にツッコミを入れてみることにしました。

classの利用方法
classはclass内に関数を定義することによって、その関数をメソッドとして利用するための型で
あることを理解しました。

理解があやふやな感じはするけど、たぶん初学者としてはギリセーフでしょう。

また、そのメソッドとリストなどのデータを一緒にしたものをインスタンスと呼んでるという理解を

しています。

言葉の上ではその通りですが、コード上で何がインスタンスなのかわかっていない気がする。

そこでclassを今以上に理解するために以下のコードを入力し実行しました。(以下のサイトを参考にさせていただきました)
https://www.sejuku.net/blog/72161

そこはやめましょう。少なくともブログのクオリティに関しては「ひどい」と言われるところです。

あまりにひどくて炎上したので、最近は中身を見直して少しましになっているようです。が、それでもクオリティは高くはないです。

私の理解ですと__init__()なる関数は最初に使うというルールを持っている関数であるみたいなのは分かるのですが、ここで使われているselfが分かりません。

このselfを適当な引数として考えてもその次の行のself.a = aが分かりません。
しかしとりあえず上は飲み込んで自分になりに勉強のために以下にコードを書いてみました。

selfがインスタンス自身を表します。

クラス内で定義されている関数は、ただ単に関数がクラスに束縛されているだけですが、インスタンス化すると同じ属性名でmethodという型になり、これは第一引数に自動的にインスタンスが渡るよう変換されています。

python

1ins = Calc(2, 3) 2ins.Sum()

python

1ins = Calc(2, 3) 2Calc.Sum(ins)

と概ね等価です。だからといってこんな書き方を常用することはありませんが。更には、だいたい同じというだけで厳密には等価ではないので、こういうことをしすぎるとバグを招くこともあります。

投稿2019/02/25 09:19

編集2019/02/25 09:29
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu__

2019/03/01 09:52

ins = Calc(2, 3) ins.Sum() と ins = Calc(2, 3) Calc.Sum(ins) が概ね等価という表現非常に分かりやすかったです。 ベストアンサーにさせていただきました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問