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

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

ただいまの
回答率

87.35%

クラス内のメソッドが機能せず

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 455

score 337

「解決済み」とさせて頂きましたが、早合点しておりました。
先の同様の質問にお答え頂いた方には、恐縮であります。
再掲にて、失礼いたします。


クラスをつくってみました。
がしかし、クラス内の、ひとつのメソッド(XORメソッド)が、うまく機能しません。
どのようにしたら良いか、どうぞ、ご教示くださいませ。

クラスは以下の通りです。

class logicCircuit:
    def __init__(self,a,b):
        self.a = a
        self.b = b

    def AND(self):
        if 0 in [self.a,self.b]:
            return 0
        else:
            return 1

    def OR(self):
        if 1 in [self.a,self.b]:
            return 1
        else:
            return 0

    def NAND(self):
        if 0 in [self.a,self.b]:
            return 1
        else:
            return 0

    def XOR(self):
        s1=self.OR()
        s2=self.NAND()
        y=self.AND(s1,s2)
        print(y)

インスタンス化した後の、メソッドのアウトプットは、次の通りです。

output = logicCircuit(0,0)

output.AND()
0

output.OR()
0

output.NAND()
1

output.XOR()
---------------------------------------------------------------
TypeError                      Traceback (most recent call last)
<ipython-input-9-9f880d5f3490> in <module>
----> 1 output.XOR()

<ipython-input-4-b416e483a293> in XOR(self)
     25         s1=self.OR()
     26         s2=self.NAND()
---> 27         y=self.AND(s1,s2)
     28         print(y)

TypeError: AND() takes 1 positional argument but 3 were given


引数の数が合っていない...ということで、どこかにselfを明示的に入れるのかな、と思ったりもしています。
よろしく、お願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

Pythonの仕様上の問題ではなく、設計の意図に沿わない使い方が問題です。
次のように書くのが正解では?

def XOR(self):
    s1=self.OR()
    s2=self.NAND()

    y = logicCircuit(s1, s2).AND()
    # print(y)
    return y

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/07 17:58

    できましたー。

    どういう「経路」でクリアされたのか、僕としては、複雑であります。どうぞ、これからの宿題とさせてくださいませ。ご回答、ありがとうございました。

    先にお答え頂いたということで、「ベストアンサー」とさせて頂きまました。(書き言葉にすると、どうしても生意気な言い方になってしまいます。す、すみません)

    キャンセル

0

ANDの定義では引数はなし(selfのみ)であるにもかかわらず、
呼び出しでs1とs2を渡しているのが原因です。
aとbをinitで定義してしまっているので、複雑になっています。

class logicCircuit:
#    def __init__(self):
#        self.a = a
#        self.b = b

    def AND(self, a, b):
        if 0 in [a, b]:
            return 0
        else:
            return 1

    def OR(self, a, b):
        if 1 in [a, b]:
            return 1
        else:
            return 0

    def NAND(self, a, b):
        if 0 in [a, b]:
            return 1
        else:
            return 0

    def XOR(self, a, b):
        s1=self.OR(a, b)
        s2=self.NAND(a, b)
        y=self.AND(s1,s2)
        print(y)

通常は上記のような形でないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/07 17:32

    しかしそうなるとクラスを組む必要が無くなってしまうのですよね。

    キャンセル

  • 2019/10/07 17:58

    ご回答、ありがとうございまーす。

    インスタンス化するときに引数を入れず、
    output = logicCircuit()
    そののち、
    output.XOR(0,0)にて、クリアできましたー。

    それぞれの関数の引数に(self)だけでなく、(self,a,b)とするのは、(たぶん)理解できていると存じます。

    def __init__については、「とりあえず、入れておこう」的な感じがありまして。こちらについては、これからの宿題とさせてくださいませ。

    キャンセル

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

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る