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.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にはまだトレイトの概念がないので微妙。
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") とすると、変換忘れがあるとメソッドが無いのでエラーになります。
文字列を継承したクラスであってもモジュールに分割することはできるのではないでしょうか?
後から付け加える際に大変になる、ということは納得できました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonのオブジェクトの関数について 2 2023/05/11 19:15
- Java オブジェクト指向プログラミングの実践本を紹介してください 3 2022/09/19 04:56
- Photoshop(フォトショップ) 「要求された操作を完了できません。プログラムエラーです」と表示されます 2 2022/07/17 01:26
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- Visual Basic(VBA) DisplayAlertsブロパティで ”実行時エラー424オブジェクトが必要です” 5 2022/05/15 18:02
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/05/21 02:41
- Visual Basic(VBA) outlook マクロが終了しません。 1 2022/09/02 11:14
- Excel(エクセル) テキストの背後にあるオブジェクトとは 3 2023/01/03 20:22
- PowerPoint(パワーポイント) パワーポイントのアニメーションについて 4 2023/06/14 16:25
- JavaScript オブジェクト配列の各メンバを任意の式で評価して、その評価値が最大のオブジェクトを返す関数はありますか 2 2023/05/20 15:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
サーブレットコンテキストの意...
-
Objectクラスのオブジェクトを...
-
VB.NETでのnothing の意義について
-
JTableで値を右寄せ表示する方法
-
JSPでのArrayListの表示につい...
-
エクセルVBA 画像を貼り付ける...
-
[ASP.NET]DropDownListのDB連携...
-
servletからjspへオブジェクト...
-
vectorの内容をString型に変換...
-
ピクチャーボックスに点を打つ...
-
VB.netでメソッドからコントロ...
-
GridViewに行追加するには?
-
VBAでの[]
-
オブジェクトの参照渡しについて
-
getParameter()について
-
UTF-8のテキストファイルを開く...
-
String型からlong型への変換は...
-
MIME::Parserのparse_dataメソ...
-
VBA Workbooks.open
-
Excel VBA 定数にオブジェクト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでの[]
-
エクセルVBA 画像を貼り付ける...
-
サーブレットコンテキストの意...
-
C#のクラスで値渡しをする
-
Vba ListViewの行挿入に関して...
-
Excel VBA 定数にオブジェクト...
-
VB.netでメソッドからコントロ...
-
servletからjspへオブジェクト...
-
javaで、、、
-
VB.NETでのnothing の意義について
-
Dispose()は、どんな時に使うの...
-
ピクチャーボックスに点を打つ...
-
VBスクリプトでテキストファイ...
-
String型からlong型への変換は...
-
JSPでのArrayListの表示につい...
-
C#で親にイベントを投げる方法
-
MessageBox.Show(Me,…の「Me」...
-
エクセルVBA/SpecialCellsで特...
-
getParameter()について
-
VBS でのソート処理Excel2003
おすすめ情報