922

私は Python プログラミング言語を学んでいますが、完全には理解できないものに出くわしました。

次のような方法で:

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

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

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

それらは OOP 構造である可能性があると思いますが、よくわかりません。

4

18 に答える 18

670

このコードでは:

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 でコンストラクターを表すものです。Pythonを呼び出すとA()、オブジェクトが作成され、最初のパラメーターとして__init__メソッドに渡されます。追加のパラメーター ( などA(24, 'Hello')) も引数として渡されます。この場合、コンストラクターが想定していないため、例外が発生します。

于 2009-03-09T05:18:46.950 に答える
287

そうです、これらは oop 構造です。

__init__クラスのコンストラクタです。パラメーターは、オブジェクトのselfインスタンスを参照します ( thisC++ の場合と同様)。

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ます (オブジェクトの存続期間中アクセス可能)。

NBこの回答での「コンストラクター」という単語の使用の明確化。技術的には、「コンストラクター」の責任は、Python の 2 つのメソッドに分割されています。これらのメソッドは__new__、(メモリの割り当てを担当) と__init__(ここで説明したように、新しく作成されたインスタンスの初期化を担当) です。

于 2009-03-09T05:18:21.693 に答える
50

要するに:

  1. selfそれが示唆するように、それ自体を参照します-メソッドを呼び出したオブジェクト。つまり、メソッドを呼び出す N 個のオブジェクトがある場合、self.aは N 個のオブジェクトごとに変数の個別のインスタンスを参照します。a各オブジェクトの変数の N 個のコピーを想像してください
  2. __init__C++/Java などの他の OOP 言語でコンストラクターと呼ばれるものです。基本的な考え方は、そのクラスのオブジェクトが作成されたときに自動的に呼び出される特別なメソッドであるということです
于 2009-03-09T05:41:21.327 に答える
35

__init__コンストラクタのように動作します。非静的メソッドとして動作させたい場合は、最初の引数としてクラス関数に「self」を渡す必要があります。「self」はクラスのインスタンス変数です。

于 2009-03-09T05:18:20.947 に答える
28

このコードを試してください。私のような多くの 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

于 2013-05-10T03:03:13.847 に答える
20

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

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

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

まったく同じように機能します。ただし、他の pythoners がより簡単に認識できるようになるため、 self を使用することをお勧めします。

于 2009-03-09T12:50:30.907 に答える
19

自己は何をしますか?どういう意味ですか?必須ですか?

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

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

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

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

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

于 2017-10-21T10:01:19.347 に答える
17
  1. __init__基本的には、特定のオブジェクトのクラスのプロパティを「初期化」 / 「アクティブ化」する関数であり、作成されて対応するクラスに一致すると..
  2. selfこれらのプロパティを継承するオブジェクトを表します。
于 2015-09-03T22:19:24.633 に答える
16

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

于 2012-09-23T12:02:55.517 に答える
15

質問のデモです。

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 __name__ == '__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
于 2018-04-19T02:50:44.783 に答える
14

「自己」はクラスインスタンスへの参照です

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"
于 2009-03-09T06:09:20.840 に答える
11

このコードでは:

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

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

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

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

I am a cat and I am called Kitty
于 2015-08-25T22:02:29.363 に答える
10
# 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()
于 2016-07-02T04:15:17.837 に答える
5

Python__init__self彼らは何をしますか?

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

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

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

class SomeObject(object):

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

    def method(self):
        return self.blah 

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

an_object = SomeObject('blah')

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

後で、このオブジェクトでメソッドを呼び出したい場合があります。

an_object.method()

ドット ルックアップを実行すると、つまりan_object.method、インスタンスが関数のインスタンスにバインドされ、メソッド (上記で呼び出された) は「バインドされた」メソッドになります。つまり、インスタンスをメソッド呼び出しに明示的に渡す必要はありません。 .

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

暗黙的に渡されたself引数はself、慣例により呼び出されます。他の正当な Python 名を使用することもできますが、別の名前に変更すると、他の Python プログラマーによって tared やフェザリングを受ける可能性があります。

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

于 2017-10-25T20:21:54.373 に答える