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

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

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

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

Q&A

解決済

1回答

420閲覧

pythonのclassを2つ用いるプログラムで継承を使わずに片方に作用させる方法

Handa229

総合スコア2

Python 3.x

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

0グッド

0クリップ

投稿2022/12/25 16:14

前提

pythonのclassを用いた課題が与えられていて2つのclassによるコード作成に悩んでいます。
classを2つ必要とするのですが継承が使えない表記のためどのようにしてclassの中に別のclassを作用するべきか下記のソースコードを参考にお教えいただけると幸いです。

実現したいこと

Matrix(a,b,c,d).mul(Vector(x,y)).xと打ち込むと

行列
a b
c d

ベクトル
x
y
この2つの積の一行目が表記されるようにしたい。


Matrix(2,-2,1,3).mul(Vector(2,-3)).x
10

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

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

該当のソースコード

python3

1class Matrix(): 2 def __init__(self,a,b,c,d): 3 self.a = a 4 self.b = b 5 self.c = c 6 self.d = d 7 8 def mul(self,Vector): 9 xx = self.a*Vector().x 10 yy = self.b*Vector().y 11 return Vector(xx,yy) 12 13class Vector(): 14 def __init__(self,x,y): 15 self.x = x 16 self.y = y 17

試したこと

Vector()を親クラス、Matrix()を子クラスとして試そうとしたのですがMatrix()の引数が6つ必要となり「実現したいこと」で記載したMatrix(a,b,c,d)の引数4つと異なりうまく行きませんでした。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答1

0

ベストアンサー

クラス名と変数名を区別してください。

python

1class Matrix(): 2 def __init__(self, a, b, c, d): 3 self.a = a 4 self.b = b 5 self.c = c 6 self.d = d 7 8 def mul(self, vector): 9 x = self.a * vector.x + self.b * vector.y 10 y = self.c * vector.x + self.d * vector.y 11 return Vector(x, y) 12 13class Vector(): 14 def __init__(self, x, y): 15 self.x = x 16 self.y = y 17 18print(Matrix(2,-2,1,3).mul(Vector(2,-3)).x)

投稿2022/12/25 16:43

arcxor

総合スコア2859

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

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

Handa229

2022/12/25 17:10

わかりやすい回答ありがとうございます。クラス名で用いた文字を小文字にしたものが変数名になるのでしょうか。もう少し詳しく調べてみようと思います。次回の機会がございましたら宜しくお願い致します。
TakaiY

2022/12/26 01:24

横から失礼 「クラス名で用いた文字を小文字にしたものが変数名になる」のではありません。 どちらかというと、名前(変数名)の扱いを慎重にしなければならない。 という指摘です。 def mul(self,Vector): xx = self.a*Vector().x yy = self.b*Vector().y return Vector(xx,yy) この式の、 一番始めのVertorは、仮引数ですが、名前がクラスVectorとかぶっています。 また、 最後のreturnで返したいのは、 多分、Vectorクラスですよね。 かぶってしまうと、このスコープ(=関数内)では Vector は仮引数になってしまうので、最後のreturnでは仮引数にで渡されたVectorのオブジェクトに()を付けているので不正となります。 仮引数は何でもいいので、 def mul(self,hoge): xx = self.a*hoge().x yy = self.b*hoge().y return Vector(xx,yy) とかでもいいのです。 Vectorのインスタンスだからvectorとかいう決まりはありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問