3

次のセットアップ例があります。

class Feet:
   def __init__ (self, value = 0.0):
      self.value = value
      self.units = "f"

   def feet(self):
      return  self.value


class Meters:
   def __init__(self, value = 0.0):
      self.value = value
      self.units = "m"

   def feet(self):
      # This is probably not an accurate conversion.
      return  self.value * 2.54 * 10 


class Distance (Feet, Meters):
   def __init__(self, type = Feet()):
      Feet.__init__(self)
      Meters.__init__(self)
      print type.feet()   -- Prints 254.0
      self = type
      print self.feet()   -- Prints 254.0

dist = Distance(Meters(10.0))

print dist.units   -- Prints = "m"
print dist.value   -- Prints = 0.0
print dist.feet()  -- Prints = 0.0

クラスを Meters Class タイプに初期化して 10.0 を割り当てると、なぜ 10.0 を保持しないのか理解できないようです。ただし、単位は正しいままのようです。これがどのようにセットアップされているかについて何か不足していますか?

私の理解では、メーターの「インスタンス」を作成し、それを距離の「自己」変数に割り当てています。自己値を変更できなかった場合、単位が「f」であるかどうかを理解できましたが、単位が「m」であるため、明らかにメータークラスを自己に割り当てていますが、インスタンス化された値を取得していません。これは非常に奇妙です.

正直に言うと、この場合に何をグーグルで検索するかさえわからないので、グーグルであまり検索していないことをお詫びします。見つかったもののほとんどは、この種の問題にはまったく当てはまりませんでした。

さらに、私の計画は、基本的に、何を渡しても同じタイプに「キャスト」することでした。たとえば、フィートの場合、Feet クラスの自己インスタンスを返し、Meters クラスでは Feet(self.Value を返します。 * 2.54 * 10) なので、距離は常にフィートで表されます。

フィートの場合、フィートは次のようになります

def feet(self):
   return self

メートルフィートの場合は

def feet(self):
  return Feet(self.value * 2.54 * 10)

要約すると、初期化の一部として 2 つのクラスのうちの 1 つを渡すことができるのに、そのクラスの初期化パラメーターを使用できない理由はありますか?

距離クラスで「自己」を割り当てることができる理由は本当に不明であり、返される前は正しい初期化が行われているように見えますが、返されると正しく機能しません。

4

4 に答える 4

2

ここで Feet または Meters のいずれかから継承する理由はまったくありません。両方は言うまでもありません。これは、継承ではなく合成の典型的なケースです。特に、units クラスをパラメーターとして渡しているためです。そのサブクラスを削除すると、次の__init__ことができますself.type = type

于 2013-09-24T14:26:25.463 に答える
1

他の回答は、継承に関する問題をカバーしていますが、の再バインドはカバーしていませんself

メソッド ( など__init__) 内でselfは、インスタンスにバインドされた単なるローカル名です。名前を再バインドすることは完全に自由ですが、それは単に別のものをself参照することになります。インスタンスには影響しません

この場合、__init__返されたときにselfname はスコープ外になりますが、 distname を再バインドしていないかのように、元のインスタンスが に割り当てられますself

__init__コンストラクタではなくイニシャライザであることに注意してください。Python では、クラス ( __new__) のカスタム コンストラクターを定義することもできます。コンストラクターは、返されるオブジェクトを変更できます。ただし、ここでは使用する必要はありません。

于 2013-09-24T14:32:26.557 に答える
0

この行:

self = type

あなたが思っていることをしません。これは代入文だと思います。その中で、によって参照されるオブジェクトは、C++ のようなself属性を持ちます。type

Python には、他の言語にあるような代入はありません。

その行が行うことは、現在バインドさselfれているオブジェクトにローカル名をバインドすることです。type以外ではまったく効果がなく、以前にバインドさDistance.__init__()れていたオブジェクトには事実上効果がありません。self

于 2013-09-24T14:34:32.257 に答える