あなたの割り当ては後方にあります:
self.angle1 = angle1
等
何が起こっているのかを少し考えてみると、ここで役立つかもしれません。 self
渡されるクラスのインスタンスですTriangle
。つまり、
T = Triangle()
T.method_call() #basically the same as `Triangle.method_call(T)`
内method_call
でself
は、 への参照T
です。(__init__
は魔法のようなものです -- 最初の行で自動的に呼び出されますが、原則は同じです)。それがわかれば、必要な理由は簡単にわかります。self.whatever = whatever
オブジェクトに新しい属性を設定しているのT
です。
最後に、これはあなたがどのように書くべきかを説明しますcheck_angles
:
def check_angles(self):
#remember, `self` is a reference to a triangle instance -- T in our hypothetical code
#so we can use `self` to gain access to all the attributes we set in `__init__`.
if self.angle1 + self.angle2 + self.angle3 == 180:
return True
else:
return False
ここで、クラス属性に簡単に転用します。クラスに属性を配置することもできます。
class Triangle:
number_of_sides = 3
メソッド (関数) を定義する前にクラス属性を定義するのが通例だと思いますが、実際にはそうする必要はありません。(ただし、コードの読者がそれを理解するのに役立ちます-あなたが物事を行った順序のために、元のコードを誤解しました)。
クラスが作成された後でも、クラスに属性を動的に追加できます。
class Triangle:
...
Triangle.number_of_angles = Rhombus.number_of_angles - 1
いくつかの方法でアクセスできTriangle.some_attribute
ます。最初の方法は、クラスを直接使用する方法です ( Triangle.number_of_sides
)。2 つ目の方法は、インスタンスを使用する方法です。
T = Triangle()
T.number_of_sides
これは最初は少しおかしいようです。結局のところ、インスタンスにはnumber_of_sides
属性がありません。Python は、最初number_of_sides
にインスタンスを調べて、独自の属性があるかどうかを確認するように設計されていることがわかりました。もしそうなら、それはあなたが得るものです。そうでない場合、python は属性のクラスを調べます。これは、クラスのインスタンス間でデータを共有する便利な方法になります。