Pythonクラス中_init__関数とselfパラメータの関係


一.クラスの定義と初期化Pythonでは、classキーで独自のクラスを定義し、カスタムクラスオブジェクトクラスでインスタンスオブジェクトを作成できます.最も簡単なクラスは次のとおりです.
>>> class FirstClass:
>>>         pass

クラスのインスタンス化は次のとおりです.
>>> a = FirstClass()
>>> b = FirstClass()
>>> print(a)
<__main__.firstclass object="" at="" class="hljs-number">0x0000013AD9F03630>
>>> print(b)
<__main__.firstclass object="" at="" class="hljs-number">0x0000013AD9F03748>

ここでは,aとbの2つの異なるオブジェクトを見ることができる.
二.ベースクラスに定義されているクラスを表示するには、属性とメソッドはありませんが、親クラス(ベースクラス)が継承されています.FirstClassが継承しているクラスを表示するには、次の方法を使用します.
>>> FirstClass.__bases__
(<class 'object'>,)

三.属性の追加
上で定義したクラスには属性とメソッドはありません.インスタンス化されたオブジェクトに以下のように属性を付与できます.
>>> a = FirstClass()
>>> b = FirstClass()
>>> a.x=1
>>> b.x=2
>>> print(a.x)
1
>>> print(b.x)
2

ここを通って
<object>.<attribute>=<value>

の文法を属性に割り当て、この方式を点記法と呼ぶ.なお、付与できる値は、Pythonの元の内蔵データ型、他のオブジェクト、または関数または別のクラスであってもよい.
四.クラスメソッドとselfパラメータ次に、x座標とy座標を含むPoint座標点のクラスを定義します.座標を原点にリセットする方法があります.
>>> class Point:
...     def reset(self):
...             self.x = 0
...             self.y = 0
...
>>> p =Point()
>>> p.x=3
>>> p.y=4
>>> print(p.x)
3
>>> print(p.y)
4
>>> p.reset()
>>> print(p.x)
0
>>> print(p.y)
0
>>>

上の私たちはdefでクラスメソッドを定義しました.それは普通の関数と少し違います.彼はselfパラメータを持っています.メソッドのselfパラメータは、メソッドオブジェクトを呼び出す参照です.p.reset()メソッドを呼び出すとselfパラメータが入力されていないことに気づきました.ここでPythonは私たちがpオブジェクトを呼び出している方法を知っているので、このオブジェクトを自動的にこの方法に転送します.つまり、
>>> p.reset()

次のように等価です.
Point.reset(p)

次に、2点間の距離を計算する簡単なクラスを実現します.
>>> import math
>>> class Point:
...     def move(self,x,y):
...             self.x = x
...             self.y = y
...     def reset(self):
...             self.move(0,0)
...     def distance(self,other):
...             return math.sqrt(
...                     (self.x-other.x)**2+
...                     (self.y-other.y)**2)
...
>>> p1=Point()
>>> p2=Point()
>>> p1.move(0,0)
>>> p2.move(3,4)
>>> p1.distance(p2)
5.0
>>> p2.distance(p1)
5.0

ここでは,オブジェクトがselfパラメータを呼び出す方法をより明確に見ることができる.五.オブジェクト初期化のほとんどのオブジェクト向け言語には、コンストラクション関数と呼ばれる特殊な方法があり、作成されるとオブジェクトが作成され初期化されます.ここでPythonはそれらと少し異なり、Pythonには構造関数と初期化関数があります.ほとんどの場合,構造関数はあまり用いられないが,ここではクラスの初期化関数に重点を置いている.クラスの初期化関数は特殊な名前を除いて、他の方法と何の違いもありません.
__init__

RT,上がPythonクラスの初期化方法の名前である.
注意:Pythonのメソッドの開始と終了には二重下線があり、これは特殊なメソッドであることを示しています.Python内蔵メソッドと理解できるので、自分でメソッドをカスタマイズするときにこのような定義方法を避けることができます.
ユーザがPointオブジェクトを初期化するときにx座標値とy座標値を指定するように要求する、Pointクラスに初期化方法を追加してみました.
import math

class Point(object):
    def __init__(self, x, y):
        pass
    def move(self,x,y):
        self.x = x
        self.y = y
    def reset(self):
        self.move(0,0)

    def distance(self,other):
        return math.sqrt(
                (self.x-other.x)**2+(self.y-other.y)**2)

if __name__ == '__main__':
    p1 = Point(2,3)
    p2 = Point(3,5)
    p1.reset()
    p2.move(3,4)
    print(p1.distance(p2))