我的拳击比我的体重还重,但请容忍这个业余的Python。我是一个专业的PHP开发人员,以前几乎没有接触过这种语言。
我想做的是在类中调用一个方法…听起来很简单吗?对于“self”指的是什么,以及在类内和类外调用这种方法的正确过程,我感到非常困惑。
有人能给我解释一下如何用变量RIGHT
调用move
方法吗。我试过在几个“学习python”网站上研究这个问题,并在StackOverflow上搜索,但没有成功。任何帮助都将不胜感激。
下面的类在Scott的Python脚本中工作,该脚本由终端GUI(urwid)访问。
我使用的函数是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)
所有方法的第一个参数通常称为
self
。它引用正在为其调用方法的实例。假设你有:
然后,做:
称为
self
没有什么特别的,您可以执行以下操作:然后,做:
在您的具体情况下:
(如注释中所建议的,
MissileDevice.RIGHT
在这里可能更合适!)但是,您可以在模块级声明所有常量,因此您可以:
然而,这将取决于您希望如何组织代码!
如果除了python之外,你还用其他语言编写了类,那么
可能不熟悉。在python中,类是对象的工厂,但它本身就是对象;在其作用域中定义的变量附加到类中,而不是类返回的实例。要引用上面的
bar
,只需调用它Foo.bar
;还可以通过类的实例访问类属性,如Foo().bar
。当您在python对象上设置属性acecss时,解释器会注意到,当查找的属性在类上并且是函数时,它应该返回一个“绑定”方法,而不是函数本身。所有这一切只会安排将实例作为第一个参数传递。
假设你有一个闪亮的Foo类。 你有三个选择:
1)要在类的定义中使用类的方法(或属性):
2)要使用类定义之外的类的方法(或属性)
3)要使用实例化类的方法(或属性):
相关问题 更多 >
编程相关推荐