回答:
このコードでは:
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')
)も引数として渡されます。この場合、コンストラクターがそれらを予期していないため、例外が発生します。
A.x
またはから利用できますa.x
。特定のクラスでオーバーライドしてもベースには影響しないため、次に出力A.x = 'foo'; a.x = 'bar'; print a.x; print A.x
されることに注意してくださいbar
foo
self
ます。これは慣例によるものです。
object
クラス宣言では?一部のクラスにはこれがあるものとないものがあることに気づきました
object
、デフォルトで発生するため、明示的に継承する必要はありません。
ええ、あなたは正しいです、これらはおっと構造です。
__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
たオブジェクト(オブジェクトの存続のためにアクセス可能)。
self
、コンストラクタに参加したくない理由はありますか?なぜそれを指定する必要があるのでしょうか?それが暗黙的であった方がいいのではないでしょうか?
クラス内で宣言された変数と__init__
関数内で宣言された変数の違いを理解するために使用した簡単な例を次に示します。
class MyClass(object):
i = 123
def __init__(self):
self.i = 345
a = MyClass()
print(a.i)
print(MyClass.i)
出力:
345
123
__init__
渡されるものであり、同じ名前を持つクラス自体の「静的」変数ではありません...
このコードを試してください。私のような多くの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
属性参照は、Pythonでのすべての属性参照に使用される標準構文obj.nameを使用します。有効な属性名は、クラスオブジェクトの作成時にクラスの名前空間にあったすべての名前です。したがって、クラス定義が次のようになったとします。
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
次にMyClass.i
、MyClass.f
有効な属性参照であり、それぞれ整数と関数オブジェクトを返します。クラス属性も割り当てることができるので、MyClass.i
割り当てによって値を変更できます。__doc__
も有効な属性であり、クラス「A simple example class」に属するdocstringを返します。
クラスのインスタンス化は関数表記を使用します。クラスオブジェクトが、クラスの新しいインスタンスを返すパラメータなしの関数であると考えてください。例えば:
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 :)
私自身、これを理解するのに苦労しました。ここで答えを読んだ後でも。
__init__
方法を正しく理解するには、自己を理解する必要があります。
自己パラメータ
__init__
メソッドが受け入れる引数は次のとおりです。
def __init__(self, arg1, arg2):
ただし、実際には2つの引数のみを渡します。
instance = OurClass('arg1', 'arg2')
余分な議論はどこから来たのですか?
オブジェクトの属性にアクセスするときは、名前(または参照)で行います。ここでのインスタンスは、新しいオブジェクトへの参照です。instance.printargsを使用して、インスタンスオブジェクトのprintargsメソッドにアクセスします。
__init__
メソッド内からオブジェクト属性にアクセスするには、オブジェクトへの参照が必要です。
メソッドが呼び出されるたびに、メインオブジェクトへの参照が最初の引数として渡されます。慣例では、常にこの最初の引数をメソッドselfに呼び出します。
これは、__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
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、それが呼び出され、そのクラスの中から、他の機能は、セットアップのデフォルト値に包み使用していないです。
'self'はクラスインスタンスへの参照です
class foo:
def bar(self):
print "hi"
これで、fooのインスタンスを作成し、そのメソッドを呼び出すことができます。この場合、Pythonによってselfパラメータが追加されます。
f = foo()
f.bar()
ただし、メソッド呼び出しがクラスのインスタンスのコンテキストにない場合も渡すことができます。以下のコードは同じことを行います
f = foo()
foo.bar(f)
興味深いことに、変数名 'self'は単なる慣例です。以下の定義はまったく同じように機能します。それは常に従うべき非常に強力な規則であると述べましたが、言語の柔軟な性質について何かを述べています
class foo:
def bar(s):
print "hi"
s
)と呼ぶことができるという事実は、Pythonの柔軟性を示していると言っていたようです。
質問の単なるデモです。
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 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
自己は何をしますか?それはどういう意味ですか?それは必須?
initを含むすべてのクラスメソッドの最初の引数は、常にクラスの現在のインスタンスへの参照です。慣例により、この引数の名前は常にself
です。initメソッドでself
は、新しく作成されたオブジェクトを参照します。他のクラスメソッドでは、メソッドが呼び出されたインスタンスを参照します。
Python は、「self」の使用を強制しません。好きな名前を付けることができます。ただし、メソッド定義の最初の引数はオブジェクトへの参照であることを忘れないでください。Pythonはself
引数をリストに追加します。メソッドを呼び出すときにこれを含める必要はありません。initメソッドでselfを指定しなかった場合、エラーが発生します
TypeError: __init___() takes no arguments (1 given)
initメソッドは何をしますか?なぜ必要なのですか?(等。)
init
初期化の略です。これは、クラスのインスタンスを作成するときに呼び出されるコンストラクタであり、必要ありません。しかし、通常は、オブジェクトのデフォルト状態を設定するためのinitメソッドを作成するのが慣例です。最初にオブジェクトの状態を設定するつもりがない場合は、このメソッドを記述する必要はありません。
# 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__
が呼び出されて、オブジェクトが作成された後にオブジェクトがカスタマイズされます。つまり、以下で呼び出すSomeObject
と'blah'
(何でもかまいません)、__init__
引数として関数に渡されますblah
。
an_object = SomeObject('blah')
self
引数がのインスタンスであるSomeObject
ことがに割り当てられますan_object
。
後で、このオブジェクトのメソッドを呼び出すことができます。
an_object.method()
ドットルックアップ、つまり、 an_object.method
、インスタンスが関数のインスタンスにバインドされ、メソッド(上記のように呼び出されます)が「バインドされた」メソッドになります。つまり、インスタンスをメソッド呼び出しに明示的に渡す必要がないということです。
メソッド呼び出しは、ドット付きルックアップにバインドされているためインスタンスを取得し、呼び出されると、実行するようにプログラムされたコードを実行します。
暗黙的に渡されたself
引数はself
、慣例により呼び出されます。他の適切なPython名を使用することもできますが、別の名前に変更すると、他のPythonプログラマーがタールを付けたりぼかしたりする可能性があります。
__init__
Python datamodelドキュメントに記載されている特別なメソッドです。これは、インスタンスが作成された直後に呼び出されます(通常は__new__
-を使用し__new__
ますが、不変のデータ型をサブクラス化しない限り必要ありません)。
ここでは、その男はかなり上手でシンプルに書いています:https : //www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/
これへの参照として上記のリンクを読んでください:
self
?それでは、すべてのCustomerメソッドに対するそのselfパラメーターとは何でしょうか。それは何ですか?もちろん、インスタンスです。言い換えると、withdrawのようなメソッドは、抽象的な顧客の口座からお金を引き出すための指示を定義します。jeff.withdraw(100.0)を呼び出すと、それらの命令がjeffインスタンスで使用されます。したがって、def withdraw(self、amount):と言うときは、「Customerオブジェクト(これをselfと呼びます)とドルの数値(これをamountと呼びます)からお金を引き出す方法です。は、withdrawが呼び出されているCustomerのインスタンスです。これは、私が類似しているわけでもありません。jeff.withdraw(100.0)は、Customer.withdraw(jeff、100.0)の省略形であり、完全に有効です(頻繁に表示されない場合)コード。
init selfは他の方法でも意味があるかもしれませんが、initはどうですか?initを呼び出すと、オブジェクトを作成している最中なので、どのようにしてすでにselfが存在しているのでしょうか。Pythonを使用すると、オブジェクトが正確に適合しない場合でも、オブジェクトが構築されるときに自己パターンを拡張できます。jeff = Customer( 'Jeff Knupp'、1000.0)がjeff = Customer(jeff、 'Jeff Knupp'、1000.0);を呼び出すのと同じであると想像してください。渡されたjeffも結果になります。
これが、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は完全に初期化されたオブジェクトです。
x = 'Hello'
外側でクラスの内側に置くとどうなりますか?それは同じであるjavaのようですか、それとも一度だけ初期化される静的変数のようになりますか?