私は Python プログラミング言語を学んでいますが、完全には理解できないものに出くわしました。
次のような方法で:
def method(self, blah):
def __init__(?):
....
....
何をしself
ますか?どういう意味ですか?必須ですか?
メソッドは何をし__init__
ますか?なぜそれが必要なのですか?(等。)
それらは OOP 構造である可能性があると思いますが、よくわかりません。
このコードでは:
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')
) も引数として渡されます。この場合、コンストラクターが想定していないため、例外が発生します。
そうです、これらは oop 構造です。
__init__
クラスのコンストラクタです。パラメーターは、オブジェクトのself
インスタンスを参照します ( this
C++ の場合と同様)。
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
パラメータx
とy
パラメータはスタック上の変数に格納され、init メソッドがスコープ外になると破棄されます。これらの変数を として設定し、それらの変数をself._x
オブジェクトself._y
のメンバーとして設定しPoint
ます (オブジェクトの存続期間中アクセス可能)。
NBこの回答での「コンストラクター」という単語の使用の明確化。技術的には、「コンストラクター」の責任は、Python の 2 つのメソッドに分割されています。これらのメソッドは__new__
、(メモリの割り当てを担当) と__init__
(ここで説明したように、新しく作成されたインスタンスの初期化を担当) です。
要するに:
self
それが示唆するように、それ自体を参照します-メソッドを呼び出したオブジェクト。つまり、メソッドを呼び出す N 個のオブジェクトがある場合、self.a
は N 個のオブジェクトごとに変数の個別のインスタンスを参照します。a
各オブジェクトの変数の N 個のコピーを想像してください__init__
C++/Java などの他の OOP 言語でコンストラクターと呼ばれるものです。基本的な考え方は、そのクラスのオブジェクトが作成されたときに自動的に呼び出される特別なメソッドであるということです__init__
コンストラクタのように動作します。非静的メソッドとして動作させたい場合は、最初の引数としてクラス関数に「self」を渡す必要があります。「self」はクラスのインスタンス変数です。
このコードを試してください。私のような多くの 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
self
実際には有効な python 識別子である可能性があることに注意してください。たとえば、Chris B の例から、次のように簡単に書くことができます。
class A(object):
def __init__(foo):
foo.x = 'Hello'
def method_a(bar, foo):
print bar.x + ' ' + foo
まったく同じように機能します。ただし、他の pythoners がより簡単に認識できるようになるため、 self を使用することをお勧めします。
自己は何をしますか?どういう意味ですか?必須ですか?
init を含むすべてのクラス メソッドの最初の引数は、常にクラスの現在のインスタンスへの参照です。慣例により、この引数は常に名前が付けられself
ます。init メソッドでself
は、新しく作成されたオブジェクトを参照します。他のクラス メソッドでは、メソッドが呼び出されたインスタンスを参照します。
Pythonは、 「self 」の使用を強制しません。任意の名前を付けることができます。ただし、メソッド定義の最初の引数は object への参照であることを忘れないでください。Python がリストに引数を追加します。メソッドを呼び出すときに含める必要はありません。init メソッドで self を指定しなかった場合、エラーが発生します。self
TypeError: __init___() takes no arguments (1 given)
initメソッドは何をしますか? なぜそれが必要なのですか?(等。)
init
初期化の略です。これは、クラスのインスタンスを作成するときに呼び出されるコンストラクターであり、必須ではありません。しかし、通常、オブジェクトのデフォルト状態を設定するための init メソッドを書くのが私たちの習慣です。最初にオブジェクトの状態を設定したくない場合は、このメソッドを記述する必要はありません。
__init__
基本的には、特定のオブジェクトのクラスのプロパティを「初期化」 / 「アクティブ化」する関数であり、作成されて対応するクラスに一致すると..self
これらのプロパティを継承するオブジェクトを表します。基本的に、同じクラス内の複数の関数で変数を使用する場合は、'self' キーワードを使用する必要があります。initに関しては、そのクラス内から他の関数が呼び出されない場合にデフォルト値を設定するために使用されます。
質問のデモです。
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
「自己」はクラスインスタンスへの参照です
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"
このコードでは:
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
# 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()
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
インスタンスです。SomeObject
an_object
後で、このオブジェクトでメソッドを呼び出したい場合があります。
an_object.method()
ドット ルックアップを実行すると、つまりan_object.method
、インスタンスが関数のインスタンスにバインドされ、メソッド (上記で呼び出された) は「バインドされた」メソッドになります。つまり、インスタンスをメソッド呼び出しに明示的に渡す必要はありません。 .
メソッド呼び出しは、ドット付きルックアップにバインドされているためインスタンスを取得し、呼び出されると、実行するようにプログラムされたコードを実行します。
暗黙的に渡されたself
引数はself
、慣例により呼び出されます。他の正当な Python 名を使用することもできますが、別の名前に変更すると、他の Python プログラマーによって tared やフェザリングを受ける可能性があります。
__init__
Python データモデルのドキュメントに記載されている特別なメソッドです。インスタンスが作成された直後に呼び出されます (通常は__new__
-を介して呼び出され__new__
ますが、不変データ型をサブクラス化する場合を除き、必須ではありません)。