35

次のコードを実行しているときにエラーが発生します。

class Person:
  def _init_(self, name):
    self.name = name

  def hello(self):
    print 'Initialising the object with its name ', self.name

p = Person('Constructor')
p.hello()

出力は次のとおりです。

Traceback (most recent call last):  
  File "./class_init.py", line 11, in <module>  
    p = Person('Harry')  
TypeError: this constructor takes no arguments

どうしたの?

4

3 に答える 3

57

メソッドは__init__、ではなくコンストラクターになるように名前を付ける必要があり_init_ます。(二重下線に注意してください。)

単一のアンダースコアを使用する場合は、という名前のメソッドを作成し、_init_引数をとらないデフォルトのコンストラクターを取得するだけです。

于 2012-09-16T16:05:12.757 に答える
11

には二重下線を使用し__init__ます。

class Person:
  def __init__(self, name):

(Pythonのすべての特別なメソッドは、単一ではなく二重のアンダースコアで開始および終了します。)

于 2012-09-16T16:05:07.237 に答える
3

Pythonコンストラクターを宣言するには、二重アンダースコア(__init__)(PythonのDunderまたはmagicメソッド)を使用する必要があります。

基本的なカスタマイズ:

__init__インスタンスが作成された後に呼び出され、__new__作成されたオブジェクトをカスタマイズするために使用されます。

インスタンスが作成された後(new()によって)、呼び出し元に返される前に呼び出されます。引数は、クラスコンストラクター式に渡される引数です。基本クラスにinit()メソッドがある場合、派生クラスのinit()メソッドがある場合は、インスタンスの基本クラス部分が適切に初期化されるように、明示的に呼び出す必要があります。例:super()。init([args ...])。

new()とinit()はオブジェクトの構築で連携して機能するため(new )で作成し、init ()でカスタマイズ)、 init()でNone以外の値を返すことはできません。これを行うと、実行時にTypeErrorが発生します。

Pythonには2種類のコンストラクタがあります。

  • デフォルトのコンストラクター:パラメーター化されたコンストラクターを宣言しない場合に使用されます。その定義には、構築中のインスタンス(別名self)への参照である引数が1つだけあります。
def __init__(self):
    # default constructor 
  • パラメーター化されたコンストラクター:パラメーターに加えて他のパラメーターを取りselfます。
def __init__(self, parameters):
    # parameterized constructor 

パラメーター化されたコンストラクターを宣言しない場合、Pythonはパラメーターを受け取らないデフォルトのコンストラクターを使用します。そのため、デフォルトのコンストラクターに引数を渡したところ、例外がスローされました。

それを修正する方法は?

インスタンスをインスタンス化できるパラメーター化されたコンストラクターを宣言するだけです。

Python3:

class Person:
    def __init__(self, name):
        self.name = name
于 2020-08-18T14:46:35.733 に答える