4

私はコード アカデミー ストリームを行っており、Ruby の経験が少しあります。関数にパラメーターcheck_angles(self)が必要な理由がわかりません。self

私が混乱している理由は、呼び出されたときに self パラメータを関数に渡す理由がわからないからです。関数呼び出し (コード ブロックの最後の行) は暗黙的に self を渡しているようですが、関数は self をパラメータとして明示的に定義する必要があります。

どうしてこれなの?

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):
        sum_angles = self.angle1 + self.angle2 + self.angle3
        if sum_angles == 180:
            return True
        else:
            return False

    tri = Triangle(45,34,78)
    tri.check_angles(EMPTY BUT WHY)
4

2 に答える 2

9

これが Python で機能する方法は、メソッドを使用してクラスFooをインスタンス化すると、メソッドを作成するために使用される関数が、それをインスタンスに「バインド」するbar(self)タイプのオブジェクトにラップされるため、呼び出しによって実際に が呼び出されます。instancemethodfoo_inst.bar()Foo.bar(foo_inst)

class Foo(object):
    def bar(self):
        print "called bar on %s" % self

foo_inst = Foo()

# these 2 calls are equivalent
foo_inst.bar()
Foo.bar(foo_inst)

または、対話的に:

>>> Foo.bar
<unbound method Foo.bar>

>>> Foo().bar
<bound method Foo.bar of <__main__.Foo object at 0x10675ecd0>>

ご覧のとおり、クラスに直接アタッチされている間barバインドされていないメソッドであり、まだ引数を持っていますが、インスタンスselfからメソッド オブジェクトを取得すると、パラメーターが既にに事前設定されているバインドされたメソッドになります。メソッド オブジェクトを取得したインスタンス。Fooself

これは、またはまたはまたはなどselfのように、実際に好きなように呼び出すことができる理由でもあります。arg0thismeputin

実際、この例では、メソッドが実際には内部の関数であることがさらに明らかになります。

class Foo(object):
    pass

def bar(arg0):
    print "called bar with %s" % arg0

Foo.bar = bar

Foo().bar()  # prints: called bar with <Foo object at 0x10675b2d0>

Python Descriptors @ https://docs.python.org/2/howto/descriptor.htmlも参照してください。これがどのように実装されているか、同様のスキームを自分で実装する方法について説明しています。

于 2014-04-15T11:38:51.463 に答える
0

関数は引数を 1 つ取るため、呼び出すtri.check_angles()ときに混乱します。check_angles実際、あなたは正しいです。はtriとして渡される引数ですself

selfクラスの特定のインスタンスにローカルな変数を保持するためにクラスで使用されます。

class A():
    def __init__(self):
        self.x = 2

>>> a = A()
>>> b = A()
>>> print a.x
2
>>> print b.x
2
>>> a.x = 5
>>> print a.x
5
>>> print b.x
2

一方、x代わりにself.xの値xを 1 つのインスタンスに変更した場合xすべてのインスタンスの値が変更されます。

それが役立つことを願っています。

于 2014-04-15T11:37:10.143 に答える