-2

私はまだ Python のクラスについて頭を悩ませています。

class Triangle(object):
    def __init__(self, angle1, angle2, angle3):
        angle1 = self.angle1
        angle2 = self.angle2
        angle3 = self.angle3
    number_of_sides = 3
    def check_angles(angle1, angle2, angle3):
        if angle1+angle2+angle3 == 180:
            return True
        else:
            return False

my_triangle = Triangle(30, 60, 90)
print(Triangle.number_of_sides)
print(Triangle.check_angles)

では、何が問題なのですか?

Stackoverflow には本当に意地悪なユーザーが何人かいます。私は MathStackExchange から来ましたが、ここで行うほど初心者/初心者の質問に反対票を投じませんでした。

4

4 に答える 4

5

あなたの割り当ては後方にあります:

self.angle1 = angle1

何が起こっているのかを少し考えてみると、ここで役立つかもしれません。 self渡されるクラスのインスタンスですTriangle。つまり、

T = Triangle()
T.method_call()  #basically the same as `Triangle.method_call(T)`

method_callselfは、 への参照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 は属性のクラスを調べます。これは、クラスのインスタンス間でデータを共有する便利な方法になります。

于 2013-01-24T16:57:21.147 に答える
1

多くの説明がなくても、自分で学ぶことができますが、クラスを作成して使用する方法は次のとおりです。

class Triangle(object):
    def __init__(self, angle1, angle2, angle3):
        self.angle1 = angle1
        self.angle2 = angle2
        self.angle3 = angle3
    number_of_sides = 3
    def check_angles(self):
        return self.angle1+self.angle2+self.angle3 == 180

my_triangle = Triangle(30, 60, 90)
print(Triangle.number_of_sides)
print(my_triangle.check_angles())

出力:

3
True
于 2013-01-24T17:47:52.537 に答える
1

これは Python Koans の演習だと思います。素晴らしい図書館と幸運を!

あなたには2つの問題があると思います。

最初は課題です。左側が自分です。

2 番目はメソッドの作成です。self 変数を渡し、属性をそのまま参照する必要があります

class Triangle(object):
    def __init__(self, angle1, angle2, angle3):
        self.angle1 = angle1
        self.angle2 = angle2
        self.angle3 = angle3
        self.number_of_sides = 3
    def check_angles(self):
        if self.angle1 + self.angle2 + self.angle3 == 180:
            return True
        else:
            return False
于 2013-01-24T17:07:06.747 に答える
1

コンストラクタを次のように書くつもりだったと思います:

class Triangle(object):
    def __init__(self, angle1, angle2, angle3):
        self.angle1 = angle1
        self.angle2 = angle2
        self.angle3 = angle3
于 2013-01-24T16:58:22.950 に答える