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

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

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

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

Q&A

解決済

3回答

330閲覧

pythonでMyFamily クラスを定義し、自分の家族全員のオブジェクトを生成したい

Rondon7251

総合スコア89

Python

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

0グッド

0クリップ

投稿2020/04/05 08:43

MyFamily クラスを定義し、自分の家族全員のオブジェクトを生成したいです。

・フィールド:
- 家族の名前を示すString型のprivateな変数 name
- 家族の年齢を示すint型のprivateな変数 age
- 家族の人数を示すint型のstaticかつprivateな変数 family_num
・メソッド:
- コンストラクタMyFamily
- 家族の情報を表示するインスタンスメソッド display
- 家族の人数を表示するクラスメソッド displayFamilyNum

java

1class MyFamily{ 2 3 private String name; //String型のprivateな変数name 4 private int age; //int型のprivateな変数age 5 private static int family_num;//int型のstaticかつpraivateな変数family_num 6 7 public MyFamily(String name, int age){ //コンストラクタ 8 this.name = name; 9 this.age = age; 10 } 11 12 public void display(){ //家族の情報 インスタンスメソッド 13 System.out.println("名前;"+name+" "+"年齢;"+age+"才"); 14 15 family_num++; 16 } 17 18 static void displayFamilyNum(){ //家族人数 クラスメソッド 19 System.out.println("家族構成"+family_num+"人"); 20 } 21} 22 23public class Kadai11{ 24 public static void main(String[] args){ 25 26 MyFamily ryunosuke = new MyFamily("龍之介", 21); 27 ryunosuke.display(); 28 MyFamily brother = new MyFamily("弟", 19); 29 brother.display(); 30 MyFamily mother = new MyFamily("母", 45); 31 mother.display(); 32 MyFamily father = new MyFamily("父", 45); 33 father.display(); 34 MyFamily.displayFamilyNum(); 35 } 36} 37

pythonだとどうすればいいかわかりませんでした。
何かわかる方がいましたら教えてください。

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

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

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

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

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

guest

回答3

0

ベストアンサー

家族の名前を示すString型のprivateな変数 name

家族の年齢を示すint型のprivateな変数 age

Pythonにprivateはありません。ついでにフィールドの型もないのですが、そちらは型ヒントを書くつもりがなければどうでもいいでしょう。
(変数の型がないというべきか。なので最初はintにした属性にあとからstrを入れても全然問題ない)

属性名の先頭に一つ_(アンダースコア)をつけることで、「プライベートとみなす」という慣習があり、そうすると気持ちの上ではプライベートのような気になれます。もちろん名前の先頭に_がつくだけで、機能的には普通の属性です。

家族の人数を示すint型のstaticかつprivateな変数 family_num

厳密な意味でのstaticもないです。すべてが動的な言語で一体どんな意味を持つというのか?

でもクラスオブジェクトに属性を持たせることはできるので、そうすることにします。

コンストラクタMyFamily

__init__という名前で定義する決まりになっています。それ以外はだいたい同じです。あとインスタンスメソッドは第一引数にオブジェクト自身が渡されると想定してselfを受け取らないといけないという決まりがあります(Javaなどのthisに相当するが明示的に第一引数で取らないと動かない。まあ、Javaのメソッドにしたってコンパイルされたら同じようなやり方をしているはずなのですが)。

家族の情報を表示するインスタンスメソッド display

上に書いたあたりに注意して普通に作ればよし。

家族の人数を表示するクラスメソッド displayFamilyNum

クラスメソッドにしたいときはclassmethodデコレータを付ける必要があります。第一引数にはclsとしてクラス自身を取ります。要するに、クラスオブジェクトのインスタンスメソッドを追加したみたいなものです(変な概念ですが)。


けっこういろいろ書いてみましたが、結論としてはtiitoiさんのコードとほとんど同じ……一応自分の回答に合わせてあちこち変えました。

python

1class MyFamily: 2 _family_num = 0 3 4 def __init__(self, name, age): 5 self._name = name 6 self._age = age 7 type(self)._family_num += 1 8 9 def display(self): 10 print(f"名前;{self._name} 年齢;{self._age}才") 11 12 @classmethod 13 def displayFamilyNum(cls): 14 print(f"家族構成{cls._family_num}人") 15 16 17ryunosuke = MyFamily("龍之介", 21) 18ryunosuke.display() 19 20brother = MyFamily("弟", 19) 21brother.display() 22 23mother = MyFamily("母", 45) 24mother.display() 25 26father = MyFamily("父", 45) 27father.display() 28 29MyFamily.displayFamilyNum()

投稿2020/04/05 21:36

hayataka2049

総合スコア30933

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

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

0

型宣言が不要という点以外は Java とほとんど変わらないと思います。
言語とは関係ないですが、family_num++ をする場所は、display() ではなく、コンストラクタでするべきではないでしょうか

python

1class MyFamily: 2 family_num = 0 3 4 def __init__(self, name, age): 5 self.name = name 6 self.age = age 7 MyFamily.family_num += 1 8 9 def display(self): 10 print(f"名前;{self.name} 年齢;{self.age}才") 11 12 @staticmethod 13 def displayFamilyNum(): 14 print(f"家族構成{MyFamily.family_num}人") 15 16 17ryunosuke = MyFamily("龍之介", 21) 18ryunosuke.display() 19 20brother = MyFamily("弟", 19) 21brother.display() 22 23mother = MyFamily("母", 45) 24mother.display() 25 26father = MyFamily("父", 45) 27father.display() 28 29MyFamily.displayFamilyNum()

投稿2020/04/05 10:06

tiitoi

総合スコア21956

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

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

0

Pythonのドキュメントは読まれましたか?
他の言語経験者であればドキュメントを読まれれば理解できるかと思います。

9. クラス

投稿2020/04/05 08:48

meg_

総合スコア10583

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問