pythonでクラスを書き、オブジェクトを作りそこにメッセージを送ることでオブジェクトの属性を変化させる、というのがオブジェクト指向であると学んでいました。
ここで
>>> import zlib
>>> s = 'witch which has which witches wrist watch'
>>> t = zlib.compress(s)
というのは圧縮する機械にメッセージを送ったら圧縮されたメッセージが出てくるイメージになります。
ここで
文字列を継承して圧縮関数?を加えた実装を考えます
>>> s = 'witch which has which witches wrist watch'
>>> t = s.compress("zip")
これはそもそも可能でしょうか?できるとしてなぜ前者の実装となるのでしょうか?
オブジェクト指向、というとオブジェクトにメッセージを送るとそのメッセージによってオブジェクトの変数が操作されると考えてきました。
そうなると後者のほうが正しように感じられます
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
まず。
t = zlib.compress(s)
は
・zlibモジュールオブジェクトに「sを圧縮しろ」というメッセージを送る(メソッドを使用)
・zlibモジュールオブジェクトは、それに応じて「圧縮されたs」をメッセージとして返す(戻り値)
(・返してきたメッセージを変数tとして記憶する)
ということです。
これは、オブジェクト指向の操作として正しい、ということはよろしいですね?
となると、「どちらが正しい」という絶対的なものではなく「どちらがより有用であるか」という相対的あるいは思想的なものになります。
私は、前者が妥当と思います。
後者は「文字列を操作するようなメソッドは、文字列型のメソッドとして実装すべきだ」という考えになります。
その考えに従えば、正規表現モジュールre等も、文字列クラスにならなければなりません。
自作した「文字列の末尾に"0"を追加した文字列を返すメソッド」も、文字列クラスのメソッドとして定義しなければなりません。
この手法でいけば、文字列(を継承した)クラスは、とても大規模なものになります。
大規模なプログラムは、それだけ間違いも多くなり、それを探すのに苦労するようになります。
モジュール毎に分割すれば、そのモジュールとしての機能にのみ注目すればよくなります。
オブジェクト指向の目的は、正しいプログラムを楽に作ることです。
どんなメッセージでも受け付ける完璧なオブジェクトを作ることではありません。
Pythonでの実装となると、その言語環境特有の問題もあります。
strを継承して、メソッドを追加するなら
def compress(self,t)
if t="zip":
return zip.compress(self)
という感じになるでしょう。結局、圧縮用オブジェクトに圧縮してもらうことになります。
こういうことをしない、となると、strに組込むしかなく、ソースコードからの変更が必要となります。
> s = 'witch which has which witches wrist watch'
Pythonの変数には、型はありません。
オブジェクトにラベルを付ける、程度のものでしかありません。
文字列リテラルは、あくまで文字列型です。いわば
s = str('witch which has which witches wrist watch')
と書いてあるようなものです。
compressを追加した文字列 CompressibleString を定義したとして、この変数sをCompressibleStringにしたいのなら
s=CompressibleString( 'witch which has which witches wrist watch')
等コンストラクタとして書くとか
s=ConvertToCompressibleString( 'witch which has which witches wrist watch')
等と変換メソッドを使うとかして、CompresibleString型にする必要があります。
これらは、定数以外にも、既存の関数の戻り値等、CompressibleStringを使いたい全ての文字列に必要です。
うかつに s.compress("zip") とすると、変換忘れがあるとメソッドが無いのでエラーになります。
文字列を継承したクラスであってもモジュールに分割することはできるのではないでしょうか?
後から付け加える際に大変になる、ということは納得できました
No.3
- 回答日時:
オブジェクト指向にはいくつか派閥があってですね、
> オブジェクトを作りそこにメッセージを送ることでオブジェクトの属性を変化させる
これはSmalltalk派の説明ですね。
PythonはどちかというとSimula派なので、
型や継承システムの方が重要っぽいです。
t = zlib.compress(s)
のzlibは単なるモジュールなので、
オブジェクトというより単なる入れ物という意味合いが強いです。
つまりzlibに中に整理分けされているcompress関数を使っているだけ。
t = s.compress("zip")
という書き方はできるのかというと、
実は Python 2.x までは似たような書き方ができた。
>>> s = 'witch which has which witches wrist watch'
>>> s.encode('zlib')
さすがに圧縮と文字エンコーディングは違うと気づいたのか、
3.xでは削られましたが。
> 文字列を継承したクラスであってもモジュールに分割することはできるのではないでしょうか?
そういう設計にできないことはないんと思うけど、
Pythonにはまだトレイトの概念がないので微妙。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javaでブラウザ判定
-
VBスクリプトでテキストファイ...
-
VBAでの[]
-
VBS でのソート処理Excel2003
-
エクセルVBA/SpecialCellsで特...
-
インストール時に入力したユー...
-
VB.netでメソッドからコントロ...
-
エクセルVBA Property Let とメ...
-
PrintFormを使用してのプリント
-
オブジェクトの参照渡しについて
-
C#のクラスで値渡しをする
-
エクセルVBAで、条件に一致する...
-
C#でフォームのオブジェクト名...
-
JTextFieldの入力制限
-
VBA 同じ名前のオブジェクトを...
-
「天声人語」をインターネット...
-
成人式の後中3のクラスで集まろ...
-
河合塾のクラス分けについて
-
「タイプ初期化子が例外をスロ...
-
例外処理throws
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
VBAでの[]
-
サーブレットコンテキストの意...
-
VB.netでメソッドからコントロ...
-
C#のクラスで値渡しをする
-
Excel VBA 定数にオブジェクト...
-
servletからjspへオブジェクト...
-
VB.NETでのnothing の意義について
-
javaで、、、
-
PrintFormを使用してのプリント
-
Vba ListViewの行挿入に関して...
-
String型からlong型への変換は...
-
Dispose()は、どんな時に使うの...
-
ピクチャーボックスに点を打つ...
-
C#で親にイベントを投げる方法
-
VBS でのソート処理Excel2003
-
JSPでのArrayListの表示につい...
-
VB2005でADDとINSERTの違いは?
-
[ASP.NET]DropDownListのDB連携...
-
ADOのOPENで実行時エラー
おすすめ情報