私は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のコンストラクタを表すものです。 A()
を呼び出すと、Pythonはあなたに代わってオブジェクトを作成し、それを__init__
メソッドに最初のパラメータとして渡します。追加のパラメータ(A(24, 'Hello')
など)も引数として渡されます - この場合、コンストラクタはそれらを予期していないため、例外が発生します。
うん、あなたは正しい、これらはおっとの構文です。
__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
あなたのx
とy
パラメータはスタック上の変数に格納され、initメソッドが範囲外になると破棄されます。これらの変数をself._x
およびself._y
として設定すると、それらの変数はPoint
オブジェクトのメンバーとして設定されます(オブジェクトの存続期間中はアクセス可能です)。
ちょっとした手助けになることを願って、これは私がクラスの中で宣言された変数と__init__
関数の中で宣言された変数の違いを理解するのに使った簡単な例です:
class MyClass(object):
i = 123
def __init__(self):
self.i = 345
a = MyClass()
print a.i
345
print MyClass.i
123
要するに:
self
が示唆しているように、 自身 - メソッドを呼び出したオブジェクトを指します。つまり、メソッドを呼び出すN個のオブジェクトがある場合、self.a
はN個の各オブジェクトに対して変数の個別のインスタンスを参照します。各オブジェクトについて、変数a
のN個のコピーを想像してください。__init__
は、C++/Javaなどの他のOOP言語でコンストラクタと呼ばれるものです。基本的な考え方は、そのClassのオブジェクトが作成されたときに自動的に呼び出される special メソッドであるということです。__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
これを自分で理解できなくて困った。ここで答えを読んだ後でも。
__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
属性参照は、Pythonですべての属性参照に使用される標準構文obj.nameを使用します。有効な属性名は、クラスオブジェクトが作成されたときにクラスの名前空間にあったすべての名前です。したがって、クラス定義が次のようになっているとします。
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
MyClass.i
とMyClass.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 :)
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 については、そのクラス内から他の関数が呼び出されない場合のデフォルト値の設定に使用されます。
__init__
は基本的に "初期化" / "activate" 作成されて対応するクラスにマッチした特定のオブジェクトに対するクラスのプロパティ - .self
はそれらのプロパティを継承するオブジェクトを表します。'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"
# 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
質問のためのデモです。
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
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__
は必要ありません)。
ここでは、男はかなりよくシンプルに書いています: 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は完全に初期化されたオブジェクトです。