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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

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

Q&A

解決済

3回答

1534閲覧

tupleを継承したクラスが可変長引数を受け取らない

sin471

総合スコア50

Python 3.x

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

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

0グッド

0クリップ

投稿2022/01/18 10:11

前提・実現したいこと

任意の数の座標を引数として受け取るPointクラスを作成したいのですが、下記のエラーが発生しています

可変長引数をやめてtupleで渡せば解決しますが、見栄えが悪いのでなるべく避けたいと考えています

インスタンス化の際に直接(?)カンマ区切りで引数を渡す方法はありますか?

python

1class Point(tuple): 2 def __init__(self, *coordinates): 3 super().__init__(coordinates) 4 self.coordinates = coordinates 5 6a = Point(1, 2) 7

発生している問題・エラーメッセージ

Traceback (most recent call last): File "c:/Programming/practice/object_oriented/object.py", line 27, in <module> a = Point(1, 2) TypeError: tuple expected at most 1 argument, got 2

試したこと

何故かlistから継承すればうまくいくのですが、なるべくtupleで受け取りたいと考えています

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

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

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

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

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

can110

2022/01/18 11:24

tupleから継承したい明確な理由は何でしょうか?
guest

回答3

0

ベストアンサー

いちおう以下のように__new__を使えばできます。
参考:Subclassing tuple with multiple init arguments

Python

1class Point(tuple): 2 def __new__ (cls, *coordinates): 3 return super(Point, cls).__new__(cls, coordinates) 4 5a = Point(1, 2) 6print(type(a)) # <class '__main__.Point'> 7print(a) # (1, 2)

ただ、明確な理由がないのであれば派生でIs tupleとしなくても以下のようにHas tupleとするのでもよいのではないかとも思います。

Python

1class Point(): 2 def __init__(self, *coordinates): 3 self.coordinates = coordinates 4 5a = Point(1,2) 6print(a.coordinates) # (1, 2)

投稿2022/01/18 11:40

can110

総合スコア38262

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

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

0

tupleの派生クラスだとうまくいかないようです。
tupleにこだわらなければ、以下のものがご希望の条件に近いと思います。

Python

1>>> class Point(list): 2... def __init__(self, *coordinates): 3... super().__init__(coordinates) 4... 5>>> a = Point(1, 2) 6>>> print(a) 7[1, 2]

追加

と思ったのですが、listは実験済みだったのですね。

投稿2022/01/18 11:18

編集2022/01/18 11:19
ppaul

総合スコア24666

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

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

0

StackOverflowに似たような質問がありました。

https://stackoverflow.com/questions/1565374/subclassing-tuple-with-multiple-init-arguments

tupleを継承する場合は__new__を引数を代入し、__init__でメンバーを初期化すればいいようです。ただし、__init__で初期化したメンバーは(tupleと異なり)immutableではなくなります。

python

1class Point(tuple): 2 def __new__(cls, *coordinates): 3 return super(Point, cls).__new__(cls, coordinates) 4 def __init__(self, *coordinates): 5 self.coordinates= coordinates 6a = Point(1, 2)

immutableでない、とは次のような操作ができてしまうということです。

Python

1a = Point(1, 2) 2a.coordinates = (3, 4) 3print(a) 4# (1, 2)

これはあまり望ましくない振る舞いですね。

投稿2022/01/18 11:17

tachikoma

総合スコア3601

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問