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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

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

Q&A

解決済

2回答

4034閲覧

Python プリミティブ型 ラッピング オブジェクト指向

_Victorique__

総合スコア1392

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

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

0グッド

1クリップ

投稿2017/06/15 04:55

オブジェクト指向において、プリミティブ型はラッピングするように言われていますが、pythonにはプリミティブ型というか怪しいです(全てがオブジェクトな為)。
となると、他の言語のようにラッピングする意味はないのでしょうか?
それともラッピングしたクラスにメソッドを持たせるから意味があるのでしょうか?

python

1class Velocity: 2 def __init(self,num): 3 self._num = num 4 5 def ntimes(n): 6 return self._num *= n 7 8 9class A: 10 def __init__(self,num): 11 self._velocity = Velocity(num) 12 13 def calcDistance(minutes,multi): 14 return minutes*self._velocity.ntimes(multi)

このような認識でよろしいのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

「オブジェクト指向エクササイズ」にでてくる制限の一つですね。

あれの意図は、異なる概念には異なる型を与えようってことです。

たとえばプログラム中に「金額」「在庫」と言う概念があったら、
両方をintで表すのではなく、
intをラップして、Money,Stockのようにしましょう。ってことです。

投稿2017/06/15 06:49

ozwk

総合スコア13521

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

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

KSwordOfHaste

2017/06/15 06:51

あらら、自分の読み方が浅かったです。回答感謝です。
_Victorique__

2017/06/15 06:52

回答ありがとうございます。 それは理解しているのですが、Pythonにおいてラッピングは必要なのでしょうか?Pythonはプリミティブ型という概念がないらしいので。
ozwk

2017/06/15 07:00

異なる概念に無理やり同じ型を当てはめるなという話で、 そういうことをする人って大抵の場合すでに用意された基本的な型を使っているわけで、 そういう基本的な型は他の言語だと「プリミティブ」に相当してるので、 「プリミティブはラップしろ」という表現になっているだけかと。
ozwk

2017/06/15 07:05

もっといえば 本質が、「異なる概念には異なる型を与えよう」というのを理解していて、 「pythonのintはプリミティブじゃないから在庫と金額にどっちもintをつかっていいのかな?」 という疑問が起こるのも変な話では。 「動的型付けで恩恵が受けられるのか?」という疑問ならまあ...
KSwordOfHaste

2017/06/15 07:06

プリミティブ型と書いてありますが「汎用の型」と読み替えれば理解しやすいと思います。 strではなくてaddressやpostalCodeやnameというクラスにした方がよいとか、 floatの配列ではなくてvectorという型にしたほうがいいとか・・・ そういうことですよね?
_Victorique__

2017/06/15 07:12

>ozwk様 そういう疑問ではなく、ラッピングすることでその変数に関する処理を、ラップしたクラスに分離することができるのもメリットなのかという意味です。 >KSwordOfHaste様 strではなくてaddressやpostalCodeやnameというクラスにした方がよい これですかね
ozwk

2017/06/15 07:15

> ラッピングすることでその変数に関する処理を、ラップしたクラスに分離することができるのもメリット メリットですね。
_Victorique__

2017/06/15 07:16

>ozwk様 これで疑問が解決しました。ありがとうございました!
guest

0

プリミティブ型はラッピングするように言われていますが

そうでしょうか?どこにそういうことが書いてあったか例を示していただけると「そういった人が何を意図していたか」の背景がわかるかも知れません。

Java言語ですとプリミティブ型と参照型の扱い方に区別があり、例えばジェネリクスの型引数にはプリミティブ型が指定できないので、List<int>とはかけず泣く泣くList<Integer>と書かねばならないため、int型をInteger型へラップするしか手がないという場面はあります。

しかしpythonが動的型付けをする言語(変数に型を宣言しない)ので、intでもでstrでも自然に同じ変数へ代入できるわけで、type hintでも例えばList[int]とか普通に書けます。Javaコーダーにはうらやましい(?)制限のない世界ですね。ゆえに特になにか理由がない限りラッピングする必要はないと思います。

もちろん質問者さんがおっしゃるように「何か特別な機能を追加するため」にラップするのは他の言語でもよく見られるテクニックですが、それはプリミティブ型に限って用いられるわけではないので「プリミティブ型はラッピングするように言われています」の理由としては弱いと思います。

投稿2017/06/15 06:21

KSwordOfHaste

総合スコア18394

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

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

KSwordOfHaste

2017/06/15 06:49

前者はJavaに限った例であり、一般のオブジェクト指向に通用する話とは区別して考える方がよさそうです。例えばPythonに限らずScala, C#, Smalltalkなどでもプリミティブをラップする(ことはできるが)積極的にしなくてもよいものが多いと思います。Smalltalkにいたってはプリミティブ型という概念がないです。pythonもないのでは? 後者の方は何ページあたりでしょうか?沢山ページがあるので見つけるのが・・・
KSwordOfHaste

2017/06/15 07:03

なるほど、こちらもozwkさんのコメントと同じ意味ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問