1

クラス__init__の代わりに使用すると、いくつかのことが機能しません。init__この2つの違いは何なのか、ただただ興味があります。

これがクラスの一部です。しかし、それは で機能し、 では機能しないため、実際には問題でinit__はありません__init__。タイプミスだったということは理解しています。

class Point(namedtuple('Point', 'x, y, z')):
  'class of a point as a tuple array'
  __slots__ = () # prevent creation of instance dictionaries to save memory

  def init__(self, x, y, z):
    self.x = x
    self.y = y
    self.z = z

  def __del__(self):
    'delete the Point'

  def __repr__(self):
    'Return a nicely formatted representation string'
    return '[%r, %r, %r]' % (self)

  def __str__(self):
    'printing format'
    return '%s[%r, %r, %r]' % (self.__class__.__name__,
                               self.x, self.y, self.z)

  def __add__(self, other):
    return Point(self.x + other.x, self.y + other.y, self.z + other.z)

  def __sub__(self, other):
    return Point(self.x - other.x, self.y - other.y, self.z - other.z)

  def __mul__(self, scal):
    'multiplication ny scalar'
    return Point(self.x * scal, self.y * scal, self.z * scal)

  def __div__(self, scal):
    'division ny scalar'
    if scal != 0.0:
        return Point(self.x / scal, self.y / scal, self.z / scal)
    else:
        sys.exit('Division by zero!')

私の質問は、「オブジェクトを 2 つの異なる方法でインスタンス化する方法は?」というものでした。このようにして、完全に機能します。

これをどう説明する?

4

3 に答える 3

10

__init__インスタンスの初期化に使用されるフックです。(インスタンスの作成時に常に呼び出されます)。

init__変な名前の単なるクラスメソッドです。

コードを提示する必要があります。という名前のメソッドがあるときに何かが壊れている場合は__init__、そこで間違いを犯しました。名前を変更するinit__と、自動的に呼び出されないため、コーディングの間違いを引き起こすことはありません。

あなたが参照しているコメントでは、著者コメントで使用__init__しましたが、先頭のアンダースコアをエスケープするのを忘れており、代わりに太字のテキストを開始するコードとして解釈されました。

__this is bold__

これは太字になります。そのコメントでは末尾の__on__main__ も失われていることに注意してください。

__init__更新されたコードでは、タプルの (サブクラス) のメソッドをオーバーライドしようとしていますが、これは特殊なケースです。__init__メソッドの名前を に変更すると、init__のメソッドが作成され、この一般的な問題はまったく発生しませんでした。

これが問題である理由の詳細については、複数の __init__ 引数を持つ Python タプルのサブクラス化を参照してください。__new__代わりにメソッドを作成する必要があります。__new__インスタンスを作成するファクトリ メソッドであり__init__、データを初期化します。ただし、ファクトリがインスタンスを作成した後にインスタンスを変更することは想定されていないため、namedtupleorなどの不変型では機能しません。tuple

この特定のケースでは、サブクラスがおよび属性の初期化をすでに処理しているため、__init__または__new__メソッドはまったく必要ありません。あなたに名前を変更することで物事はうまくいきましたが、決して使用しない無意味な方法になってしまいます. 削除するだけです。namedtuplePointxyz__init__init__init__

于 2012-11-13T11:34:46.547 に答える
3

init__Python では特別な意味はありません。それは単なる方法です。

__init__オブジェクトのインスタンス化時に自動的に呼び出される魔法のメソッドです。

init__機能しても__init__機能しない場合は、コード内で何かが壊れています。おそらくそのメソッドで、それが呼び出された場合、init__ほぼ確実にまったく呼び出されないためです。

于 2012-11-13T11:34:39.760 に答える
2

__init__クラスの新しいオブジェクトが作成されるときに常に呼び出される特別なメソッドです。追加の属性を定義したり、何らかの方法でオブジェクトの動作を変更したりする場合にのみ、オーバーロードする必要があります。

于 2012-11-13T11:35:01.977 に答える