web-dev-qa-db-ja.com

Pythonクラスのメソッドを呼び出す

私はここで自分の体重をはるかに上回っていますが、このPythonアマチュアに耐えてください。私はPHP業界の開発者であり、この言語にはほとんど触れていません。

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

誰か説明私に、変数moveRIGHTメソッドを呼び出す方法を教えてください。いくつかの「Pythonを学ぶ」サイトでこれを調査し、StackOverflowで検索しましたが、役に立ちませんでした。任意の助けをいただければ幸いです。

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

私が使用している関数は、スコットウェストンのミサイルランチャー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)
27
kirgy

すべてのメソッドの最初の引数は通常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の方が適切な場合があります!)

couldモジュールレベルですべての定数を宣言するので、次のことができます。

dangerous_device.move(RIGHT)

ただし、これはコードの編成方法に依存します!

57
Thomas Orozco

輝かしいFooクラスがあるとしましょう。さて、あなたは3つのオプションがあります:

1)クラスの定義内でクラスのメソッド(または属性)を使用する場合:

class Foo(object):
    attribute1 = 1                   # class attribute (those don't use 'self' in declaration)
    def __init__(self):
        self.attribute2 = 2          # instance attribute (those are accessible via first
                                     # parameter of the method, usually called 'self'
                                     # which will contain nothing but the instance itself)
    def set_attribute3(self, value): 
        self.attribute3 = value

    def sum_1and2(self):
        return self.attribute1 + self.attribute2

2)クラスの定義外でクラスのメソッド(または属性)を使用したい

def get_legendary_attribute1():
    return Foo.attribute1

def get_legendary_attribute2():
    return Foo.attribute2

def get_legendary_attribute1_from(cls):
    return cls.attribute1

get_legendary_attribute1()           # >>> 1
get_legendary_attribute2()           # >>> AttributeError: type object 'Foo' has no attribute 'attribute2'
get_legendary_attribute1_from(Foo)   # >>> 1

3)インスタンス化されたクラスのメソッド(または属性)を使用する場合:

f = Foo()
f.attribute1                         # >>> 1
f.attribute2                         # >>> 2
f.attribute3                         # >>> AttributeError: 'Foo' object has no attribute 'attribute3'
f.set_attribute3(3)
f.attribute3                         # >>> 3
6

誰かが私に説明することができます、変数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では、クラスはオブジェクトのファクトリですが、それ自体がオブジェクトです。そのスコープで定義された変数は、クラスによって返されるインスタンスではなく、classに付加されます。上記の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オブジェクトの属性をacecssすると、ルックアップされた属性がクラスにあり、関数である場合、インタプリタは関数自体ではなく「バインド」メソッドを返す必要があることに気付くでしょう。 。これは、インスタンスが最初の引数として渡されるように調整するだけです。