类中的Python调用方法

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14086830/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-18 10:23:48  来源:igfitidea点击:

Python calling method in class

pythonclassmethods

提问by kirgy

I'm punching way above my weight here, but please bear with this Python amateur. I'm a PHP developer by trade and I've hardly touched this language before.

在这里,我的体重超出了我的体重,但请容忍这个 Python 业余爱好者。我是一名 PHP 开发人员,以前几乎没有接触过这种语言。

What I'm trying to do is call a method in a class...sounds simple enough? I'm utterly baffled about what 'self' refers to, and what is the correct procedure to call such a method inside a class and outside a class.

我想要做的是在类中调用一个方法......听起来很简单吗?我对“自我”指的是什么,以及在类内和类外调用这种方法的正确过程感到困惑。

Could someone explainto me, how to call the movemethod with the variable RIGHT. I've tried researching this on several 'learn python' sites and searches on StackOverflow, but to no avail. Any help will be appreciated.

有人可以向我解释一下,如何move使用变量调用方法RIGHT。我试过在几个“学习 python”网站上研究这个并在 StackOverflow 上搜索,但无济于事。任何帮助将不胜感激。

The following class works in Scott's Python script which is accessed by a terminal GUI (urwid).

以下类在 Scott 的 Python 脚本中工作,该脚本可通过终端 GUI (urwid) 访问。

The function I'm working with is a Scott Weston's missile launcher Python script, which I'm trying to hook into a PHP web-server.

我正在使用的函数是 Scott Weston 的导弹发射器 Python 脚本,我试图将其挂接到 PHP 网络服务器中。

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)

采纳答案by Thomas Orozco

The first argument of all methods is usually called self. It refers to the instance for which the method is being called.

所有方法的第一个参数通常称为self。它指的是为其调用方法的实例。

Let's say you have:

假设你有:

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

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

Then, doing:

然后,做:

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


There's nothing special about this being called self, you could do the following:

这个被调用没有什么特别的self,你可以执行以下操作:

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

    def bar(this_object):
        this_object.foo()

Then, doing:

然后,做:

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


In your specific case:

在您的具体情况下:

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

(As suggested in comments MissileDevice.RIGHTcould be more appropriate here!)

(正如评论中所建议的,MissileDevice.RIGHT这里可能更合适!)

You coulddeclare all your constants at module level though, so you could do:

可以在模块级别声明所有常量,因此您可以执行以下操作:

dangerous_device.move(RIGHT)

This, however, is going to depend on how you want your code to be organized!

但是,这将取决于您希望如何组织代码!

回答by SingleNegationElimination

Could someone explain to me, how to call the move method with the variable RIGHT

有人可以向我解释一下,如何使用变量 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)

If you have programmed in any other language with classes, besides python, this sort of thing

如果你用任何其他语言编写过类,除了 python,这种东西

class Foo:
    bar = "baz"

is probably unfamiliar. In python, the class is a factory for objects, but it is itself an object; and variables defined in its scope are attached to the class, not the instances returned by the class. to refer to bar, above, you can just call it Foo.bar; you can also access class attributes through instances of the class, like Foo().bar.

可能是陌生的。在python中,类是对象的工厂,但它本身就是一个对象;并且在其作用域中定义的变量附加到class,而不是class返回的实例。参考bar上面的,你可以直接调用它Foo.bar;您还可以通过类的实例访问类属性,例如Foo().bar.



Im utterly baffled about what 'self' refers too,

我也对“自我”指的是什么完全感到困惑,

>>> 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
>>>

When you acecss an attribute on a python object, the interpreter will notice, when the looked up attribute was on the class, and is a function, that it should return a "bound" method instead of the function itself. All this does is arrange for the instance to be passed as the first argument.

当你在 python 对象上添加一个属性时,解释器会注意到,当查找的属性在类上并且是一个函数时,它应该返回一个“绑定”方法而不是函数本身。所有这些都是安排实例作为第一个参数传递。

回答by Michele Soltanto

Let's say you have a shiny Foo class. Well you have 3 options:

假设您有一个闪亮的 Foo 类。那么你有3个选择:

1) You want to use the method (or attribute) of a class inside the definition of that class:

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) You want to use the method (or attribute) of a class outside the definition of that class

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) You want to use the method (or attribute) of an instantiated class:

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