質問が賛成したことに本当に驚いています。なんで?それは研究努力を示していますか?いいえ!OPは調査を行ったかもしれませんが、彼はそれを明らかにしませんでした。それは役に立ちましたか?はっきりしていますか?彼が匿名オブジェクトの受け渡しに問題があることは明らかです。しかし、なぜ知識を得るための彼の個人的な闘いが役立つのでしょうか?
単純な点線の灰色の楕円を作成するためだけに、なぜsuperfluosコードを入力するのにそれほど多くの「努力」をしなければならないのか疑問に思っています。まず、「Qt」ではオブジェクト指向のフレームワークを使用していることを覚えておく必要があります。したがって、用語と概念的には、オブジェクトをインスタンス化するクラスのセットを使用しています。タイプと呼ぶのはクラスです。
あなたの例では、次のことをしません。
grid.setPen(Qt.Pen)
これはsetPenにTYPEを渡しますが、 オブジェクトQt.Pen
を定義します。クラスとは異なり、オブジェクトには個別の値が含まれています:5(= )、0、3(= )。これは単純化しすぎですが、ポイントを家に帰すだけです。Qt.gray
Qt.DotLine
" type
"integer
が言うように、このタイプ(クラス)のすべてのオブジェクトは整数値を含むことができ、個々の値自体は含まれません。type
ただし、 (クラス)のすべてのインスタンスがinteger
整数値を保持する必要があることを定義しています。整数変数は、個々の値を持つクラスのインスタンス(オブジェクト)を保持します。
例に戻ると、クラス(タイプ)のオブジェクトを作成します。このオブジェクトはQtPen
、メソッドsetPen
が処理することを認識しています。
grid.setPen(Qt.QPen(Qt.Qt.gray、0、Qt.Qt.DotLine))
あなたのオブジェクトはたまたまclass(type)のものQt.Pen
です。したがって、 TYPEを渡すだけでなく、引数として明示的に言及した3つの値に加えて、オブジェクトで暗黙的に他の有用なもの(CapStyle、MiterLimit、JoinStyleなど)を1トン渡します。
Pythonでは、引数の暗黙的な型チェックはありません。だからあなたはあなたが提案したものを渡すことができます:
grid.setPen('gray'、0、'dotted')
ただし、このメソッドは、使い慣れたオブジェクトを想定しており、それらの処理方法を知っています。文字列-処理することがわからないオブジェクト。ですから、それが何をすべきかを説明するのはあなたの仕事でしょう。したがって、文字列を処理できるコンストラクターでサブクラス化Qt.Pen
するか、Qt.Penクラスを直接変更して後でQTを再コンパイルする必要があります。
Qt.Pen
クラスは最適な例ではないことを認めます。したがって、基礎となる概念と、誤った仮定の下にある場所を説明するためのより良い例を作成できます。
しかし、最初に、あなたの「代理」の質問は、オブジェクト指向のパラダイムを理解するための大きな混乱から生じていると主張しますが、より深い洞察がないため、混乱の原因を識別できませんでした-それは鶏が先か卵が先かという問題です。
ローマへの道はたくさんありますが、あなたが決めるのはあなたです。しかし、「Qt」を使用するという決定により、あなたはすでに一般的な道路のセットを決定しました。そして、それらはオブジェクト用に構築されています。
家をいくつか描きたいとしましょう。したがって、 (ちなみに、元の質問で探していたものとまったく同じです)をdraw_house
使用してメソッドを定義します。magical_drawing_routine
def draw_house(house):
magical_drawing_routine(house)
draw_house('parentshome')
draw_house('myhome')
これで、ドア、窓、または実家の素敵な煙突のない、まったく同じ2つの描かれた家ができました。magical_drawin_routine
(そして、文字列値を解釈する方法を知っている方法を完全に無視しています)
製図板に戻って、これらの欠如を修正します。
def draw_house(door, window, chimney):
magical_drawing_routine(door, window, chimney)
parentshome = ['oak', 'green', 'yes']
myhome = ['beech', 'red', 'no']
draw_house(parentshome)
draw_house(myhome)
これで、ドア、窓、そして実家の素敵な煙突が付いた、まったく同じ2つの描かれた家ができました。しかし、待ってください。窓とドアはまったく同じ形をしています。ふりだしに戻る...
いくつかのサイクルの後、あなたは次のようなものを持っているでしょう:
def draw_house(doormaterial, doorcolor, doorshape, doorwithglass, doorglassparts, windowsnumber, widnowsdistributionpattern, windowsencassing, windowmaterial, windowshape, windowpattern, windowdecoration, chimney):
...
class House, class Window, class Door, class Chimney
または、適切なデフォルト値を使用してクラスを定義することもできます。
pdoor, mdoor = Door(a,b), Door(a,Z)
pwin, mwin = Window(e,f,g), Window(e,f,Y)
pchimney, mchimney = Chimney(h), Chimney(X)
parentshome = House(pdoor, pwin, pchimney)
myhome = House(mdoor, mwin, mchimney)
親のドアを1回だけ使用する場合は、匿名オブジェクト(変数がアタッチされていない)を生成することにより、pdoor定義を省略し、引数を渡しながらオブジェクトをオンザフライでインスタンス化できます。parentshome= House(Door(。 ..)、...)
したがって、簡単な答えは次のとおりです。型を渡さないでください。通常は複雑さをカプセル化するオブジェクトを渡します。しかし、ひどい単純なオブジェクトの場合、それはあなたの過度に複雑な単純なもののように見えるかもしれません-しかし、それはまさにそれがどのように見えるかです。