🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

1回答

1131閲覧

クラス設計時のprivateメンバ変数について

websoler

総合スコア39

Python

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

0グッド

1クリップ

投稿2019/11/04 00:55

編集2019/11/04 02:07

クラス設計時に、メンバ変数を用意すると思いますが、
いわゆる作業箱的な変数を定義するって、お作法的に良いでしょうか、良くないでしょうか?

今、オライリーの「pythonによるWebスクレイピング」本を見ていますが、
以下のようなサンプルがあります。

クローリングクラス
=>メソッド1:ページオブジェクトを取得するメソッド
=>メソッド2:ページから特定の属性を取得するメソッド

メソッド1で取得したページオブジェクトを、メソッド2の引数として渡しています。
このページオブジェクトって、クラスのメンバ変数としてキープしておいてはいけないんでしょうか?
そうするとメソッド2でわざわざ引数渡しする必要がなくなります。

Webページのクローリングの際には、ページオブジェクトはあちこちで
生まれるんだし、それを作業用変数のようにメンバ変数にキープしておけば、
あちこちのメソッドで参照できて便利ではないか?

と思っていますが、これはその変数のライフサイクルが怪しくなる(どこで有効になり、どこで編集されて・・
といった、グローバル変数の問題に似てる)ため、好ましくないでしょうか?

つまり、以下のいずれの見解があっていますでしょうか。

  1. 作業箱的なprivateメンバ変数」をそもそも定義すべきではない
  2. こういったことを解決するため、なんらかのデザインパターンが用意されており、

  上記サンプルクラスはそれを適用しているだけ。
3. クローリングクラスの属性は「サイトURL」であり、そのサイトURLの分析のために用意する
ページオブジェクト(BeautifulSoupライブラリのインスタンス)は
厳密にはクローリングクラスの「属性」ではないため、外部から挿入すべき
(でもそうだとすると、そのページオブジェクトを取得するメソッドがこのクラス内にあるのが・・・)

以上、よろしくお願いいたします。

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

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

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

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

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

tanishi_a

2019/11/04 01:30 編集

「メソッド変数」→ 「メンバ変数」または「インスタンス変数」のことですかね? メンバにすること自体は、場合によるかと思いますが、別に問題ないと思います。 (2, 3 あたりは分からないので触れていません)
websoler

2019/11/04 01:48

そうです、メンバ変数のことで合っています。
tanishi_a

2019/11/04 01:49

たぶん「メソッド変数」とは言わないと思うので、質問文は編集しといたほうが良いかと。
quickquip

2019/11/04 01:50

scrapyを使ったコードではないんでしょうか?
websoler

2019/11/04 02:08

メンバ変数、修正しておきました。 scrapyフレームワークではなく、BeautifulSoupを使って直接スクレイピングするサンプルコードです。
guest

回答1

0

ベストアンサー

その場限りでしか使用しない変数なら、わざわざクラス変数にしないで引数で渡します
後で色々使い回すものなら、クラス変数にしてしまいますね。

で、クラス変数とすると、その変数のナカミがいつ有効になるか、いつまで有効であるか、というのを気にしないといけないので、
よっぽどでなければクラス変数にしないようにしていますね

投稿2019/11/04 01:43

y_waiwai

総合スコア88038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問