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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

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

Q&A

解決済

3回答

513閲覧

pythonのクラス定義の引数の使い方について

sequelanonymous

総合スコア123

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

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

0グッド

0クリップ

投稿2019/03/18 06:54

編集2019/03/18 07:31

python3.7を利用しています。一番下の書き方が正解だと思っています。しかし、上記2つのような書き方を目にしました。特に二番目の書き方だと以下のようなエラーがでます。python3.7では、上2つの書き方はできなくなったのでしょうか?(なぜエラーがでるのかよくわかっていません) こういうときには上2つのような書き方が必要になる、などご教示いただけませんでしょうか?

TypeError: __init__() takes 1 positional argument but 2 were given

以下は、クラスを呼ぶ場所

python

1def _exec(request, _id): 2 # こっちだとエラーはでない 3 a_id = TEST() 4   # 以下だとエラーがでる 5 b_id = TEST(_id) 6 7

python

1class TEST(): 2 def __init__(self, _id): 3 from logging import getLogger 4 logger = getLogger(__name__) 5 logger.info("_id of this is %s", _id) 6 self._id = _id

python

1class TEST(object): 2 def __init__(self, _id): 3 from logging import getLogger 4 logger = getLogger(__name__) 5 logger.info("_id of this is %s", _id) 6 self._id = _id

python

1class TEST: 2 def __init__(self, _id): 3 from logging import getLogger 4 logger = getLogger(__name__) 5 logger.info("_id of this is %s", _id) 6 self._id = _id

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

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

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

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

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

hayataka2049

2019/03/18 07:01

classはどこに行ったのでしょうか・・・
hayataka2049

2019/03/18 07:06

TEST: じゃなくて class TEST: なのでは? という話です・・・
tachikoma

2019/03/18 07:21

TESTのコンストラクタではloggerとidのどちらを引数に取るのでしょうか・・・。
sequelanonymous

2019/03/18 07:30 編集

> TESTのコンストラクタではloggerとidのどちらを引数に取るのでしょうか・・・。 すみません、こちらも転記ミスをしていました。修正しました。
t_obara

2019/03/18 10:50

余計なコメントになりますが、この質問こそ、「必要最小限の再現コードで確認すべき」が当てはまる内容ですね。まずは解決して良かったと思います。hayataka2049氏のおっしゃる通り、一度解決とすべきかと。
guest

回答3

0

ベストアンサー

python

1class TEST(): 2class TEST(object): 3class TEST: 4

python3では「すべて同じ」です。この丸かっこの中には継承するクラスを書きます。なければ省略できます。

  • 一番上

丸かっこだけ書いて中身を省略しているのでこの丸かっこはないのと同じ。

  • 真ん中

objectは暗黙的にすべてのクラスの基底になるため、明示的に書いても書かなくても同じ。

  • 一番下

丸かっこまで省略しても問題ない

TypeError: __init__() takes 1 positional argument but 2 were given

このエラーになったのなら、質問文で気にしているところとはまったく関係ない箇所でバグがあります。

python

1 # こっちだとエラーはでない ← 出ないとおかしい 2 a_id = TEST() 3   # 以下だとエラーがでる ← 少なくとも引数の数はこれで合うと思うんですが・・・ 4 b_id = TEST(_id)

投稿2019/03/18 07:28

編集2019/03/18 07:29
hayataka2049

総合スコア30933

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

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

sequelanonymous

2019/03/18 07:35

ありがとうございます。上記、全て同じという理解はしていましたが、自信がありませんでした。 また、転記ミスが再度あったため、修正しました。 > # こっちだとエラーはでない ← 出ないとおかしい a_id = TEST()    # 以下だとエラーがでる ← 少なくとも引数の数はこれで合うと思うんですが・・・ b_id = TEST(_id) 再度確認しましたが、a_idだとエラーがでず、b_idだとエラーが質問記載のエラーがでてしまいます。 エラーログも、__init__の箇所でとまっています。やはり、わからずという状況です。
hayataka2049

2019/03/18 07:44 編集

質問文の_exec, TESTの定義をコピペして適当な引数を与えて呼んでみましたが、再現しないです。この時点できつい状況なのですが、もう少し情報があれば問題解決に結びつくヒント程度は与えられる可能性があります。 そもそも TypeError: __init__() takes 1 positional argument but 2 were given は本当に「質問文に書かれたTEST」の__init__が吐いているのか、というあたりから正直疑問です。tracebackぜんぶ見れれば手っ取り早いんですが、手打ちで転記してるんですよね・・・
hayataka2049

2019/03/18 07:45

>再度確認しましたが、a_idだとエラーがでず、b_idだとエラーが質問記載のエラーがでてしまいます。 def __init__(self): みたいな引数フォーマットで定義された「なにか」を呼んでしまっているのでは? それがなにかまではわかりませんが。
sequelanonymous

2019/03/18 08:07 編集

> TypeError: __init__() takes 1 positional argument but 2 were given は本当に「質問文に書かれたTEST」の__init__が吐いているのか、というあたりから正直疑問です。 上記が正解でした。model定義の方でも同じクラス名を利用しておりました。そして、そちらを読みにいっていたように思います。当コードが記載されているモジュール内でmodel定義から読んだクラスを別のメソッド内で利用しています。model定義側ではコンストラクタは利用していないのでエラーのでかたがおかしい気はしています。
hayataka2049

2019/03/18 08:11 編集

そのmodelがなにか継承してるんじゃないでしょうか。 同名クラスとか書くなしという・・・
sequelanonymous

2019/03/18 08:30

はい、おっしゃる通りだと思います。。。 命名を変更しようと思うのですが、正直悩みます。同じようなデータをDBに保管してそこからデータ引っ張てきて利用するか、クラス内の変数にいれて使うかの違いなのですが、例えば、TEST_clsというような命名はよくあるものでしょうか? そもそも、どっちかに統一したほうがいいという思ったりもしますが。
hayataka2049

2019/03/18 08:36

同名のクラスを2つ作るというのはさすがに設計としてどうかと思いますが、この質問の本筋と逸れるのでここで追求する気はありません。 とりあえず、エラーがどこから出ているのか確定させちゃいましょう。 >そのmodelがなにか継承してるんじゃないでしょうか。
sequelanonymous

2019/03/18 09:36

わかりました。おそらく読みに行っていたのは、以下です。同じ関数名です。 db.Modelの中のコンストラクタを読みに行ってしまっている?!のかと思いました。 from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class TEST(db.Model): ... ...
hayataka2049

2019/03/18 09:41

なるほど。では、こちらは解決扱いにして、設計については必要であれば別途質問を立てると良いかと思います。
sequelanonymous

2019/03/18 11:03

わかりました、お付き合い頂きありがとうございました。
guest

0

sample.pyという名前で下記の内容を書き込んで試しましたが、エラーが再現しないんですよね・・・。

python

1 2from logging import getLogger 3 4class TEST: 5 def __init__(self, _id): 6 logger = getLogger(__name__) 7 logger.warning("_id of this is %s", _id) 8 self._id = _id 9 10if __name__ == "__main__": 11 test = TEST(0)

実行方法@Python 3.7.0

sh

1$ python sample.py 2_id of this is 0

投稿2019/03/18 07:43

tachikoma

総合スコア3601

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

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

sequelanonymous

2019/03/18 08:08

ご確認ありがとうございます。同じクラス名のモデル定義からデータをとってくる関数があったためそちらを読みにいっていたようです。エラーのでかたがおかしいですが。
guest

0

思っているのと違うファイルを読んでいるために、違う定義のTESTを参照しているとか。

投稿2019/03/18 07:40

otn

総合スコア84505

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

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

sequelanonymous

2019/03/18 08:04

上記が正解でした。model定義の方でも同じクラス名を利用しておりました。そして、そちらを読みにいっていたように思います。にしてもエラーのでかたがおかしいように思いますが。model定義でコンストラクタは利用していないので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問