我冲远高于此,我的体重,但请用这条巨蟒业余承担。 我的职业是PHP开发人员,我已经几乎触及之前该语言。
我正在试图做的是调用方法的类...听起来很简单? 我完全困惑什么“自我”指的是,什么是正确的程序调用该方法的类内和类外。
可能有人向我解释 ,如何调用move
与变量法RIGHT
。 我试着在研究这个几个“学习Python”在计算器上网站和搜索,但都无济于事。 任何帮助将不胜感激。
以下类的工作,其中通过一个终端GUI(urwid)访问斯科特的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)
所有方法的第一个参数通常被称为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)
然而,这是要取决于你要如何组织你的代码!
比方说,你有一个闪亮的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
可能有人向我解释,如何调用与变量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)
如果您有任何其他语言带班,除了蟒蛇,这样的事情编程
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
>>>
当你acecss Python对象的一个属性,解释会注意到,当抬头属性是在类,并且是一个函数,它应该返回一个“绑定”方法,而不是本身的功能。 这一切确实是安排实例作为第一个参数传递。