57

私はここで自分の体重をはるかに超えてパンチしていますが、この Python のアマチュアには我慢してください。私は本業の PHP 開発者ですが、この言語にはほとんど触れたことがありません。

私がやろうとしているのは、クラス内のメソッドを呼び出すことです...簡単に聞こえますか? 「自己」が何を指すのか、クラス内およびクラス外でそのようなメソッドを呼び出す正しい手順は何かについて、私はまったく困惑しています。

変数を使用してメソッドを呼び出す方法を誰かが説明してくれませんか。いくつかの 'learn python' サイトでこれを調査し、StackOverflow で検索しようとしましたが、役に立ちませんでした。どんな助けでも大歓迎です。moveRIGHT

次のクラスは、ターミナル GUI (urwid) によってアクセスされる Scott の Python スクリプトで機能します。

私が取り組んでいる関数は、Scott Weston のミサイル ランチャー Python スクリプトで、これを PHP Web サーバーに接続しようとしています。

class MissileDevice:
  INITA     = (85, 83, 66, 67,  0,  0,  4,  0)
  INITB     = (85, 83, 66, 67,  0, 64,  2,  0)
  CMDFILL   = ( 8,  8,
                0,  0,  0,  0,  0,  0,  0,  0,
                0,  0,  0,  0,  0,  0,  0,  0,
                0,  0,  0,  0,  0,  0,  0,  0,
                0,  0,  0,  0,  0,  0,  0,  0,
                0,  0,  0,  0,  0,  0,  0,  0,
                0,  0,  0,  0,  0,  0,  0,  0,
                0,  0,  0,  0,  0,  0,  0,  0)
  STOP      = ( 0,  0,  0,  0,  0,  0)
  LEFT      = ( 0,  1,  0,  0,  0,  0)
  RIGHT     = ( 0,  0,  1,  0,  0,  0)
  UP        = ( 0,  0,  0,  1,  0,  0)
  DOWN      = ( 0,  0,  0,  0,  1,  0)
  LEFTUP    = ( 0,  1,  0,  1,  0,  0)
  RIGHTUP   = ( 0,  0,  1,  1,  0,  0)
  LEFTDOWN  = ( 0,  1,  0,  0,  1,  0)
  RIGHTDOWN = ( 0,  0,  1,  0,  1,  0)
  FIRE      = ( 0,  0,  0,  0,  0,  1)

  def __init__(self, battery):
    try:
      self.dev=UsbDevice(0x1130, 0x0202, battery)
      self.dev.open()
      self.dev.handle.reset()
    except NoMissilesError, e:
      raise NoMissilesError()

  def move(self, direction):
    self.dev.handle.controlMsg(0x21, 0x09, self.INITA, 0x02, 0x01)
    self.dev.handle.controlMsg(0x21, 0x09, self.INITB, 0x02, 0x01)
    self.dev.handle.controlMsg(0x21, 0x09, direction+self.CMDFILL, 0x02, 0x01)
4

3 に答える 3

91

通常、すべてのメソッドの最初の引数は と呼ばれselfます。メソッドが呼び出されているインスタンスを参照します。

あなたが持っているとしましょう:

class A(object):
    def foo(self):
        print 'Foo'

    def bar(self, an_argument):
        print 'Bar', an_argument

次に、次のことを行います。

a = A()
a.foo() #prints 'Foo'
a.bar('Arg!') #prints 'Bar Arg!'

これが呼び出されることについて特別なことは何もありselfません。次のことができます。

class B(object):
    def foo(self):
        print 'Foo'

    def bar(this_object):
        this_object.foo()

次に、次のことを行います。

b = B()
b.bar() # prints 'Foo'

あなたの特定のケースでは:

dangerous_device = MissileDevice(some_battery)
dangerous_device.move(dangerous_device.RIGHT) 

(コメントで示唆されているように、MissileDevice.RIGHTここではより適切かもしれません!)

ただし、モジュール レベルですべての定数を宣言できるので、次のようにできます

dangerous_device.move(RIGHT)

ただし、これは、コードをどのように編成するかによって異なります。

于 2012-12-29T23:29:09.753 に答える
4

変数RIGHTでmoveメソッドを呼び出す方法を誰かに説明してもらえますか

>>> myMissile = MissileDevice(myBattery)  # looks like you need a battery, don't know what that is, you figure it out.
>>> myMissile.move(MissileDevice.RIGHT)

Python以外のクラスを含む他の言語でプログラミングしたことがある場合、この種のこと

class Foo:
    bar = "baz"

なじみがないのでしょう。Python では、クラスはオブジェクトのファクトリですが、それ自体がオブジェクトです。そのスコープで定義された変数は、クラスによって返されるインスタンスではなく、クラスにアタッチされます。上記のを参照するにbarは、単に呼び出すことができますFoo.bar。のように、クラスのインスタンスを介してクラス属性にアクセスすることもできますFoo().bar


「自分」が何を指しているのか、私もまったく困惑しています。

>>> class Foo:
...     def quux(self):
...         print self
...         print self.bar
...     bar = 'baz'
...
>>> Foo.quux
<unbound method Foo.quux>
>>> Foo.bar
'baz'
>>> f = Foo()
>>> f.bar
'baz'
>>> f
<__main__.Foo instance at 0x0286A058>
>>> f.quux
<bound method Foo.quux of <__main__.Foo instance at 0x0286A058>>
>>> f.quux()
<__main__.Foo instance at 0x0286A058>
baz
>>>

Pythonオブジェクトの属性にアクセスすると、検索された属性がクラスにあり、関数である場合、インタープリターは、関数自体ではなく「バインドされた」メソッドを返す必要があることに気付きます。これが行うのは、インスタンスが最初の引数として渡されるように手配することだけです。

于 2012-12-29T23:43:52.180 に答える