2

このような奇妙な質問を投稿して申し訳ありません。通常、私が混乱しているときは、ひらめきがあるまで「それで行き」、後で整理しますがdef __init__(self):、クラス内での呼び出しは完全に冗長に見え、省略しても同様に機能するようです:

class Pet(object):
    type_of_pet = ""
    number_of_legs = 0
    name = ""

作成できます:

fred = pet()
fred.type_of_pet = "alligator"

クラスを次のように変更した場合と同じです。

class Pet(object):
    def __init__(self):
         type_of_pet = ""

alice = Pet()
alice.type_of_pet = "Pterodactyl" 

なぜ必要なのか__init__がわかりません。ここの他のスレッドは、私が望んでいたほど明確ではありませんでした。この「クリック」を行うためにできることはありますか?

4

5 に答える 5

6

クラス定義に割り当てステートメントを配置しても、インスタンス属性は宣言されません。クラス属性を設定します。これを行うと、すべてのペットが同じnametype_of_pet、およびを共有しnumber_of_legsます。

__init__特に、インスタンス属性を設定するために使用されます。

def __init__(self, type_of_pet, name, number_of_legs):
    self.type_of_pet = type_of_pet
    self.name = name
    self.number_of_legs = number_of_legs

これにより、クラスではなくインスタンスに属性が設定されるため、各オブジェクトには独自の名前、タイプ、レッグ カウントが設定されます。

于 2013-08-19T22:32:08.503 に答える
1

__init__()インスタンス化された後にクラスに属性を割り当てることができるのに、なぜ必要なのかを尋ねています。

その答えは、オブジェクトをインスタンス化するときに属性値を渡すことができるということです。これは入力の手間を省くだけではありません。インスタンス化後にクラスに属性を割り当てると、エラーが発生しやすくなりnumber_off_legsますnumber_of_legs。属性には任意の名前が付けられる可能性があるため、これ自体はエラーではありませんが、他のコード ( を期待するnumber_of_legs) が失敗するか、この場合は間違ったデータを取得します (この時点でクラスのデフォルト値が使用されるため)。 )。また、属性名を変更する必要がある場合、その名前はコード全体にあるため、多くの場所で変更する必要があります。

したがって、これらの頭痛の種を避けるために、オブジェクトを作成して属性を割り当て、オブジェクトを返す前にその他の必要な初期化 (ファイルを開く、下位オブジェクトを作成するなど) を実行する小さな関数を作成する必要があります。 . これが__init__()メソッドであり、Python はそれをクラスに便利にアタッチして、オブジェクトをインスタンス化し、属性値を一度に渡すことができるようにします。一部のデータを格納するだけの場合はあまり役に立ちませんが、クラスがより複雑になると、非常に便利であることがわかります。

于 2013-08-19T22:38:34.007 に答える