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

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

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

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

Python

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

Q&A

解決済

4回答

1149閲覧

アトリビュートの使い方がよく分からない

memu2

総合スコア16

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2018/02/18 03:35

クラスを自分で定義するときの話です。

python

1class Animal(): 2 def __init__(self): 3 pii_chan = Bird() 4 pii_suke = Bird()

このように記述するのか、それとも

python

1class Animal(): 2 def __init__(self): 3 self.pii_chan = Bird() 4 self.pii_suke = Bird()

上記のように記述するのかでいつも悩みます。
そこで質問なのですが、アトリビュートを使うとどんなことが出来るようになるのでしょうか?
またそれを使うべき時はどんな状況ですか?
初心者にもわかりやすく教えていただけるとありがたいです。

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

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

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

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

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

guest

回答4

0

インスタンス毎に異なる値を持つもの、典型的にはそのインスタンスの状態とか固有の設定とかをアトリビュートとして考えるのが普通です。

インスタンスを複数作る必要がないものをなんでもかんでも無暗にクラスとして定義したりしてませんか?クラスを作ると決める基準の基本は「同じ操作や属性を持つような複数のインスタンスをプログラム中で使う場合」だと思います。そう考えて設計していれば「属性として何を持たせるか」は半ば自然に決まると思います。

クラスを定義する基準が曖昧だったりすると属性やメソッドとして何を定義するかもまた曖昧になってくるのではないでしょうか。

投稿2018/02/18 04:05

KSwordOfHaste

総合スコア18392

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

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

memu2

2018/02/18 05:09

返信ありがとうございます。 現在、GUIアプリケーションを作成していて、沢山のwidgetをループで動的に生成する処理を書いています。(wxPythonを使っています。) そのときに、各ウィジェットのsizerはアトリビュートに格納すべきか否か、panelは格納すべきか否かで迷ったので質問させていただきました。 皆さんにご教授頂いたことを総合すると、後からテキスト情報を参照したり、変更したりするpanelはアトリビュートに格納し、レイアウトを決めるだけで後から参照することのないsizerは格納しない、という書き方で良いのでしょうか?
KSwordOfHaste

2018/02/18 05:12

インスタンスの属性として「保持する」なら後から「参照する前提がある」のが普通と思います。
guest

0

ベストアンサー

次のように書いてもpii_chanpii_suke__init__()の実行中にのみ有効な一時変数であり、クラスのアトリビュートではありません。

python

1class Animal(): 2 def __init__(self): 3 pii_chan = Bird() 4 pii_suke = Bird()

次のように書くとクラスのアトリビュートとして定義できます。

python

1class Animal(): 2 def __init__(self): 3 self.pii_chan = Bird() 4 self.pii_suke = Bird()

こうすると、Animalクラスのインスタンスを生成後にanimalアトリビュートにアクセスできるようになります。

python

1animal = Animal() 2bird1 = animal.pii_chan 3bird2 = animal.pii_suke

ただ、これだとすべてのAnimalのインスタンスの中身が同じになってしまうので、少し変更してみます。

python

1class Animal(): 2 def __init__(self, bird1, bird2): 3 self.pii_chan = bird1 4 self.pii_suke = bird2 5animal1 = Animal("chan", "suke") 6animal2 = Animal("chanchan", "sukesuke")

こうすると、Animalは、あえて言葉で表現すると、二匹の鳥のペアを保持するクラスになりました。どの鳥のペアにするかは、インスタンスを作る時に定義してやります。そうすると、様々な鳥のペア(animal1animal2など)作り出せます。これがKSwordOfHasteさんの言うところの「同じ操作や属性を持つような複数のインスタンスをプログラム中で使う場合」に相当します。ただし、コレがAnimalの持つべき機能なのかどうかという話は横においておきます。

投稿2018/02/18 04:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

memu2

2018/02/18 05:11

ありがとうございます。一番丁寧な回答をくださったのでベストアンサーにさせて頂きました。 現在、GUIアプリケーションを作成していて、沢山のwidgetをループで動的に生成する処理を書いています。(wxPythonを使っています。) そのときに、各ウィジェットのsizerはアトリビュートに格納すべきか否か、panelは格納すべきか否かで迷ったので質問させていただきました。 皆さんにご教授頂いたことを総合すると、後からテキスト情報を参照したり、変更したりするpanelはアトリビュートに格納し、レイアウトを決めるだけで後から参照することのないsizerは格納しない、という書き方で良いのでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/18 07:24

コードを見てみないと適当なことしか言えませんが、たぶんその方針でいいと思います。あとからでもアトリビュートの追加をすることもできますので、複雑になりすぎないようあとから参照等が必要になるものだけにとどめて置くのがいい気がします。
guest

0

世の中にはが沢山いる前提でプログラミングするとします。

you = 人(name='太郎', age=19) me = 人(name=教えてください(), age=教えてください()) if me.name == you.name: print('同じ名前ですね') if me.age == you.age: print('しかも歳まで一緒!') me.記憶しておく(you) you.記憶しておく(me)

オブジェクト指向でを適切に定義してあげるとこのように、各人の属性が人オブジェクトに紐付き、その属性を直接参照したり、メソッドを通じて間接的にアクセスしたりできるようになります。つまり良い感じにプログラムを書くことができます。

もちろんオブジェクト指向を使わずに同様の処理を実現することも可能です。

投稿2018/02/18 04:10

YouheiSakurai

総合スコア6142

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

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

0

そもそも最初の例だとインスタンスのアトリビュートになっていないと思うのですが…

python

1class Animal(): 2 def __init__(self): 3 self.pii_chan = 'bird' 4 pii_suke = 'bird' 5 6if __name__=='__main__': 7 animal = Animal() 8 print(animal.pii_chan) # bird 9 print(animal.pii_suke) # AttributeError: 'Animal' object has no attribute 'pii_suke'

つまりそもそもこのように等価な処理ではないです。

(すみません国語力不足でした。)

上記コードを裏返して説明すると、このようにself.をつけることでインスタンスに値を保持することができます。

例えば以下のような使い方が考えられます。

python

1class Bird(): 2 def __init__(self,name): 3 self.name = name 4 5 def greet(self): 6 print(f'こんにちは!私は{self.name}です。') 7 8if __name__=='__main__': 9 bird1 = Bird('pii_chan') 10 bird2 = Bird('pii_suke') 11 for bird in (bird1,bird2): 12 bird.greet() 13 '''実行結果 14 こんにちは!私はpii_chanです。 15 こんにちは!私はpii_sukeです。 16 '''

投稿2018/02/18 04:04

編集2018/02/18 04:19
namnium1125

総合スコア2043

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問