k2mtr
@k2mtr (ryo)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

python初心者です。classで引っかかっています。

Python初心者です。
classを勉強しているところで自分が想定した動きをしていない理由と解決策をご教示いただけませんでしょうか。

概要

PCというクラスを作成し、OS、CPU、画面サイズ、USBポートの数をそれぞれ出力させるというコードを作成したいです。

該当するソースコード

class PC:
    def __init__(self, os, cpu, size, usb):
        self.os = os
        self.cpu = cpu
        self.size = size
        self.usb = usb

    def os_info(self, os):
        print('OSは' + os + 'です')

    def cpu_info(self, cpu):
        print('CPUは' + cpu + 'です')

    def size_info(self, size):
        print('画面サイズは' + size + 'インチです')
    
    def usb_info(self, usb):
        print('USBポートは' + usb + '個です')

実行

# osはwindows、cpuはインテル、画面サイズは13インチ、usbポートは3個のパソコン(A1234)を想定する
A1234 = PC('windows', 'Intel', '13', '3')
A1234.os_info()

自分の想定では、「PC('windows', 'Intel', '13', '3')」というところで引数を渡しているので
メソッドを入力すれば、「OSはwindowsです」という分が出力されると考えていました。

ここで引っかかっていることが自分がclassにいつまでも違和感がある理由なのではないかと考えています。
お力を貸していただけると嬉しいです。よろしくお願い致します。

0

1Answer

メソッドを入力すれば、「OSはwindowsです」という分が出力されると考えていました。

実際はどうだったのかも説明いただきたいところです。(出力、エラー等)
ですが今回はなんとなく分かったので回答してしまいます。

class PC:
    # 省略

    def os_info(self, os):
        print('OSは' + os + 'です')

    # 省略

このos_infoメソッドは引数osを1つ必要としています。
なので次のように使用します。

A1234 = PC('windows', 'Intel', '13', '3')
A1234.os_info('mac') # OSはmacです

しかし、やりたいことはインスタンス化で渡した「windows」を使用して「OSはwindowsです」と表示したいのでしょうから、これを変える必要があります。

class PC:
    def __init__(self, os, cpu, size, usb):
        self.os = os # 引数osを自身の属性osに入れる
        self.cpu = cpu
        self.size = size
        self.usb = usb

    def os_info(self): # 引数osは不要
        print('OSは' + self.os + 'です') # 自身の属性`os`を参照する

    # 省略

インスタンス化で渡した情報を使用するのですから、新たに引数を取る必要はありません。
そしてインスタンス化で渡した引数osの値は自身の属性osに入れてあるので、self.osでそれを参照します。

A1234 = PC('windows', 'Intel', '13', '3')
A1234.os_info() # OSはwindowsです

他のメソッドも同様です。

3Like

Your answer might help someone💌