web-dev-qa-db-ja.com

Python __init__とself彼らは何をしているのですか?

私はPythonプログラミング言語を学んでいて、私は完全に理解できていないことに出会いました。

のような方法で:

def method(self, blah):
    def __init__(?):
        ....
    ....

selfは何をしますか?それはどういう意味ですか?必須ですか。

__init__メソッドは何をしますか?なぜそれが必要なのですか? (等。)

それらはOOPの構成要素かもしれないと思いますが、私はあまり知りません。

667
GUIDED BOMB

このコードでは:

class A(object):
    def __init__(self):
        self.x = 'Hello'

    def method_a(self, foo):
        print self.x + ' ' + foo

... self変数は、オブジェクト自体のインスタンスを表します。ほとんどのオブジェクト指向言語はこれを隠しパラメータとしてオブジェクトに定義されたメソッドに渡します。 Pythonは違います。あなたはそれを明示的に宣言しなければなりません。 Aクラスのインスタンスを作成してそのメソッドを呼び出すと、次のように自動的に渡されます。

a = A()               # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument

__init__メソッドはおおよそPythonのコンストラクタを表すものです。 A()を呼び出すと、Pythonはあなたに代わってオブジェクトを作成し、それを__init__メソッドに最初のパラメータとして渡します。追加のパラメータ(A(24, 'Hello')など)も引数として渡されます - この場合、コンストラクタはそれらを予期していないため、例外が発生します。

515
Chris B.

うん、あなたは正しい、これらはおっとの構文です。

__init__はクラスのコンストラクタです。 selfパラメータはオブジェクトのインスタンスを参照します(C++のthisのように)。

class Point:
    def __init__(self, x, y):
        self._x = x
        self._y = y

__init__メソッドは、オブジェクトのメモリが割り当てられたときに呼び出されます。

x = Point(1,2)

オブジェクトの値を永続化したい場合は、オブジェクトのメソッド内でselfパラメータを使用することが重要です。たとえば、__init__メソッドを次のように実装したとします。

class Point:
    def __init__(self, x, y):
        _x = x
        _y = y

あなたのxyパラメータはスタック上の変数に格納され、initメソッドが範囲外になると破棄されます。これらの変数をself._xおよびself._yとして設定すると、それらの変数はPointオブジェクトのメンバーとして設定されます(オブジェクトの存続期間中はアクセス可能です)。

213
RedBlueThing

簡単な実例

ちょっとした手助けになることを願って、これは私がクラスの中で宣言された変数と__init__関数の中で宣言された変数の違いを理解するのに使った簡単な例です:

class MyClass(object):
     i = 123
     def __init__(self):
         self.i = 345

a = MyClass()
print a.i
345
print MyClass.i
123
167
Dave Everitt

要するに:

  1. selfが示唆しているように、 自身 - メソッドを呼び出したオブジェクトを指します。つまり、メソッドを呼び出すN個のオブジェクトがある場合、self.aはN個の各オブジェクトに対して変数の個別のインスタンスを参照します。各オブジェクトについて、変数aのN個のコピーを想像してください。
  2. __init__は、C++/Javaなどの他のOOP言語でコンストラクタと呼ばれるものです。基本的な考え方は、そのClassのオブジェクトが作成されたときに自動的に呼び出される special メソッドであるということです。
38
user59634

__init__はコンストラクタのように振舞います。あなたがそれらを非静的メソッドとして振る舞わせたい場合は、最初の引数として任意のクラス関数に "self"を渡す必要があります。 "self"はあなたのクラスのインスタンス変数です。

25
ewalk

このコードを試してみてください。私のような多くのCプログラマーがPyを学ぶのを助けてくれることを願っています。

#! /usr/bin/python2

class Person:

    '''Doc - Inside Class '''

    def __init__(self, name):
        '''Doc - __init__ Constructor'''
        self.n_name = name        

    def show(self, n1, n2):
        '''Doc - Inside Show'''
        print self.n_name
        print 'Sum = ', (n1 + n2)

    def __del__(self):
        print 'Destructor Deleting object - ', self.n_name

p=Person('Jay')
p.show(2, 3)
print p.__doc__
print p.__init__.__doc__
print p.show.__doc__

出力:

Jay

Sum = 5

Doc - Inside Class

Doc - __init__ Constructor

Doc - Inside Show

Destructor Deleting object - Jay

23
Jayzcode

これを自分で理解できなくて困った。ここで答えを読んだ後でも。

__init__メソッドを正しく理解するためには、selfを理解する必要があります。

自己パラメータ

__init__メソッドによって受け入れられる引数は以下のとおりです。

def __init__(self, arg1, arg2):

しかし、実際には2つの引数を渡すだけです。

instance = OurClass('arg1', 'arg2')

追加の議論はどこから来たのでしょうか。

オブジェクトの属性にアクセスするときは、名前で(または参照で)それを行います。これは私たちの新しいオブジェクトへの参照です。 instance.printargsを使ってインスタンスオブジェクトのprintargsメソッドにアクセスします。

__init__メソッド内からオブジェクトの属性にアクセスするには、オブジェクトへの参照が必要です。

メソッドが呼び出されるたびに、メインオブジェクトへの参照が最初の引数として渡されます。慣例として、この最初の引数は常に自分自身のメソッド自身に呼び出します。

これは__init__メソッドで私たちができることを意味します:

self.arg1 = arg1
self.arg2 = arg2

ここでは、オブジェクトに属性を設定しています。これは、次の手順で確認できます。

instance = OurClass('arg1', 'arg2')
print instance.arg1
arg1

このような値はオブジェクト属性と呼ばれます。ここでは、__init__メソッドはインスタンスのarg1属性とarg2属性を設定します。

ソース: http://www.voidspace.org.uk/python/articles/OOP.shtml#the-init-method

21
eee

クラスオブジェクト は2種類の操作をサポートしています。 属性参照とインスタンス化

属性参照は、Pythonですべての属性参照に使用される標準構文obj.nameを使用します。有効な属性名は、クラスオブジェクトが作成されたときにクラスの名前空間にあったすべての名前です。したがって、クラス定義が次のようになっているとします。

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

MyClass.iMyClass.fは有効な属性参照で、それぞれ整数と関数オブジェクトを返します。クラス属性も代入することができるので、代入によってMyClass.iの値を変更することができます。 __doc__も有効な属性であり、そのクラスに属するdocstringを返します。「単純な例のクラス」.

Class instantiationは関数表記法を使用します。クラスオブジェクトは、クラスの新しいインスタンスを返すパラメータのない関数であると考えてください。例えば:

x = MyClass()

インスタンス化 操作(クラスオブジェクトの「呼び出し」)は、空のオブジェクトを作成します。多くのクラスは、特定の初期状態に合わせてカスタマイズされたインスタンスを持つオブジェクトを作成するのが好きです。したがって、クラスは次のように__init__()という名前の特別なメソッドを定義することができます。

def __init__(self):
    self.data = []

クラスが__init__()メソッドを定義するとき、クラスインスタンス化は自動的に新しく作成されたクラスインスタンスのために__init__()を呼び出します。したがって、この例では、次のようにして新しい初期化インスタンスを取得できます。

x = MyClass()

もちろん、__init__()メソッドには、柔軟性を高めるための引数があります。その場合、クラスインスタンス化演算子に与えられた引数は__init__()に渡されます。例えば、

class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart

x = Complex(3.0, -4.5)
x.r, x.i

公式の ドキュメント から引用しました。


これが私の例です

class Bill():
    def __init__(self,apples,figs,dates):
        self.apples = apples
        self.figs = figs
        self.dates = dates
        self.bill = apples + figs + dates
        print ("Buy",self.apples,"apples", self.figs,"figs 
                and",self.dates,"dates. 
                Total fruitty bill is",self.bill," pieces of fruit :)")

Billクラスのインスタンスを作成すると、

purchase = Bill(5,6,7)

あなたが得る:

> Buy 5 apples 6 figs and 7 dates. Total fruitty bill is 18  pieces of
> fruit :)
16
Harvey

selfは実際には任意の有効なpython識別子になる可能性があることに注意してください。たとえば、Chris Bの例から、同じように簡単に書くことができます。

class A(object):
    def __init__(foo):
        foo.x = 'Hello'

    def method_a(bar, foo):
        print bar.x + ' ' + foo

そしてそれはまったく同じように動作します。しかし他のpythonを使う人はもっと簡単に認識できるのでselfを使うことをお勧めします。

基本的に、同じクラス内の複数の関数で変数を使用するときには 'self'キーワードを使用する必要があります。 init については、そのクラス内から他の関数​​が呼び出されない場合のデフォルト値の設定に使用されます。

14
user1675111
  1. __init__は基本的に "初期化" / "activate" 作成されて対応するクラスにマッチした特定のオブジェクトに対するクラスのプロパティ - .
  2. selfはそれらのプロパティを継承するオブジェクトを表します。
14
bishop

'self'はクラスインスタンスへの参照です

class foo:
    def bar(self):
            print "hi"

これで、fooのインスタンスを作成してそのメソッドを呼び出すことができます。この場合、selfパラメータがPythonによって追加されます。

f = foo()
f.bar()

しかし、メソッド呼び出しがクラスのインスタンスのコンテキスト内にない場合は、それを渡すこともできます。以下のコードでも同じことが行われます。

f = foo()
foo.bar(f)

興味深いことに、変数名 'self'は単なる慣例です。以下の定義はまったく同じように動作します。 非常に強い慣習 に従うべきである 常に と言っていますが、それは言語の柔軟な性質について何かを言っています

class foo:
    def bar(s):
            print "hi"
12
tarn
# Source: Class and Instance Variables
# https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables

class MyClass(object):
    # class variable
    my_CLS_var = 10

    # sets "init'ial" state to objects/instances, use self argument
    def __init__(self):
        # self usage => instance variable (per object)
        self.my_OBJ_var = 15

        # also possible, class name is used => init class variable
        MyClass.my_CLS_var = 20


def run_example_func():
    # PRINTS    10    (class variable)
    print MyClass.my_CLS_var

    # executes __init__ for obj1 instance
    # NOTE: __init__ changes class variable above
    obj1 = MyClass()

    # PRINTS    15    (instance variable)
    print obj1.my_OBJ_var

    # PRINTS    20    (class variable, changed value)
    print MyClass.my_CLS_var


run_example_func()

selfは何をしますか? 意味とは何ですか? 必須

Initを含むすべてのクラスメソッドの最初の引数は、常にクラスの現在のインスタンスへの参照です。慣例により、この引数の名前は常にselfです。 initメソッドでは、selfは新しく作成されたオブジェクトを指します。他のクラスメソッドでは、メソッドが呼び出されたインスタンスを参照します。

Python 使用を強制しない "self"。任意の名前を付けることができます。ただし、メソッド定義の最初の引数はオブジェクトへの参照であることを覚えておいてください。 Pythonは、リストにself引数を追加します。メソッドを呼び出すときに含める必要はありません。 initメソッドでselfを提供しなかった場合、エラーが発生します

TypeError: __init___() takes no arguments (1 given)

initメソッドは何をしますか?なぜ必要なのですか? (等。)

initは初期化の略です。クラスのインスタンスを作成するときに呼び出されるコンストラクターであり、必須ではありません。しかし、通常は、オブジェクトのデフォルト状態を設定するためのinitメソッドを記述するのが慣例です。オブジェクトの状態を最初に設定したくない場合は、このメソッドを記述する必要はありません。

このコードでは:

class Cat:
    def __init__(self, name):
        self.name = name
    def info(self):
        print 'I am a cat and I am called', self.name

ここで__init__はクラスのコンストラクタとして機能し、オブジェクトがインスタンス化されるとこの関数が呼び出されます。 selfはインスタンス化オブジェクトを表します。

c = Cat('Kitty')
c.info()

上記のステートメントの結果は次のようになります。

I am a cat and I am called Kitty
7
Anagha

質問のためのデモです。

class MyClass:

    def __init__(self):
        print('__init__ is the constructor for a class')

    def __del__(self):
        print('__del__ is the destructor for a class')

    def __enter__(self):
        print('__enter__ is for context manager')
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print('__exit__ is for context manager')

    def greeting(self):
        print('hello python')


if __== '__main__':
    with MyClass() as mycls:
        mycls.greeting()

$ python3 class.objects_instantiation.py
__init__ is the constructor for a class
__enter__ is for context manager
hello python
__exit__ is for context manager
__del__ is the destructor for a class
7
debug

Pythonの__init__selfは何をするのですか?

selfは何をしますか?それはどういう意味ですか?必須ですか。

__init__メソッドは何をしますか?なぜそれが必要なのですか? (等。)

与えられた例は正しくないので、それに基づいて正しい例を作成しましょう。

class SomeObject(object):

    def __init__(self, blah):
        self.blah = blah

    def method(self):
        return self.blah 

オブジェクトのインスタンスを作成すると、作成後にオブジェクトをカスタマイズするために__init__が呼び出されます。つまり、以下の'blah'を付けてSomeObjectを呼び出すと(これは何でもかまいません)、引数として__init__関数に渡されますblah

an_object = SomeObject('blah')

self引数はan_objectに割り当てられるSomeObjectのインスタンスです。

後で、このオブジェクトのメソッドを呼び出したいと思うかもしれません。

an_object.method()

ドット付きルックアップ、つまりan_object.methodを実行すると、インスタンスが関数のインスタンスにバインドされ、(上記のように)メソッドは "バインド"メソッドになります。つまり、インスタンスをメソッドに明示的に渡す必要はありませんコール。

このメソッド呼び出しは、ドット付きルックアップにバインドされているためインスタンスを取得し、呼び出されると、実行するようにプログラムされているすべてのコードを実行します。

暗黙的に渡されたself引数は、慣例でselfと呼ばれます。他の合法的なPython名を使用することもできますが、他のものに変更すると、他のPythonプログラマーからもうんざりしたり羽毛がついたりする可能性があります。

__init__は特別なメソッドで、 Pythonデータモデルドキュメントに記載されています 。インスタンスが作成された直後に呼び出されます(通常は__new__を介して - 不変のデータ型をサブクラス化しない限り__new__は必要ありません)。

5
Aaron Hall

ここでは、男はかなりよくシンプルに書いています: https://www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/

これへの参照として上記のリンクを読んでください:

self?それでは、すべてのCustomerメソッドにとって、そのselfパラメーターはどうなりますか?それは何ですか?なぜ、それはインスタンスです、もちろん!別の言い方をすれば、出金のような方法は、抽象的な顧客の口座からお金を引き出すための指示を定義します。 jeff.withdraw(100.0)を呼び出すと、それらの命令がjeffインスタンスに使用されます。

つまり、defdraw(self、amount):と言うと、「Customerオブジェクトからお金を引き出す方法(これをselfと呼びます)とドルの数字(これをamountと呼びます)から取り出します。 jeff.withdraw(100.0)は、Customer.withdraw(jeff、100.0)の単なる略記であり、これは完全に有効です(よく見られない場合)。コード。

init selfは他の方法でも意味がありますが、 init はどうでしょうか。 init を呼び出したとき、オブジェクトを作成している最中なので、どのようにして既に自己が存在できるのでしょうか。 Pythonでは、オブジェクトが正確に適合していなくても、自己パターンをオブジェクトの作成時まで拡張することができます。 jeff = Customer( 'Jeff Knupp'、1000.0)がjeff = Customer(jeff、 'Jeff Knupp'、1000.0)と同じであると想像してください。渡されたジェフも結果になります。

これが、 init を呼び出すときに、self.name = nameのようなことを言ってオブジェクトを初期化する理由です。 selfがインスタンスなので、これはjeff.name = nameと言うのと同じです。これはjeff.name = 'Jeff Knuppと同じです。同様に、self.balance = balanceはjeff.balance = 1000.0と同じです。この2行の後、Customerオブジェクトは「初期化済み」で使用可能な状態になります。

気をつけてね__init__

init が終了した後、呼び出し元はオブジェクトが使用可能であると正しく仮定することができます。つまり、jeff = Customer( 'Jeff Knupp'、1000.0)の後に、jeffでデポジットをかけたり、コールを取り消したりできます。 jeffは完全に初期化されたオブジェクトです。

3
Laxmikant