クラスを自分で定義するときの話です。
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
インスタンス毎に異なる値を持つもの、典型的にはそのインスタンスの状態とか固有の設定とかをアトリビュートとして考えるのが普通です。
インスタンスを複数作る必要がないものをなんでもかんでも無暗にクラスとして定義したりしてませんか?クラスを作ると決める基準の基本は「同じ操作や属性を持つような複数のインスタンスをプログラム中で使う場合」だと思います。そう考えて設計していれば「属性として何を持たせるか」は半ば自然に決まると思います。
クラスを定義する基準が曖昧だったりすると属性やメソッドとして何を定義するかもまた曖昧になってくるのではないでしょうか。
投稿2018/02/18 04:05
総合スコア18392
0
ベストアンサー
次のように書いてもpii_chan
やpii_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
は、あえて言葉で表現すると、二匹の鳥のペアを保持するクラスになりました。どの鳥のペアにするかは、インスタンスを作る時に定義してやります。そうすると、様々な鳥のペア(animal1
やanimal2
など)作り出せます。これがKSwordOfHasteさんの言うところの「同じ操作や属性を持つような複数のインスタンスをプログラム中で使う場合」に相当します。ただし、コレがAnimalの持つべき機能なのかどうかという話は横においておきます。
投稿2018/02/18 04:17
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/02/18 07:24
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
総合スコア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総合スコア2043
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/18 05:09
2018/02/18 05:12