我在这里是一个完整的python n00b,只是尝试将几个位混合在一起以使项目工作,但我正在努力学习一些我认为的语法。
这是我到目前为止的脚本:
#!/usr/bin/env python
from plugin import *
from siriObjects.systemObjects import ResultCallback
import uuid
import json
import random
import types
import urllib
import urllib2
import random
import re
import select
import socket
import struct
import sys
import thread
import time
class tivoRemote(Plugin):
tivo_address = '192.168.0.9'
tivo_name = ''
tivo_swversions = {}
have_zc = True
captions_on = False
sock = None
outer = None
def connect():
""" Connect to the TiVo within five seconds or report error. """
global sock
try:
sock = socket.socket()
sock.settimeout(5)
sock.connect((tivo_address, 31339))
sock.settimeout(None)
except Exception, msg:
msg = 'Could not connect to %s:\n%s' % (tivo_name, msg)
print(msg)
def send(message):
""" The core output function, called from irsend(). Re-connect if
necessary (including restarting the status_update thread), send
message, sleep, and check for errors.
"""
if not sock:
self.connect()
thread.start_new_thread(status_update, ())
try:
sock.sendall(message)
time.sleep(0.1)
except Exception, msg:
error_window(str(msg))
def irsend(*codes):
""" Expand a command sequence for send(). """
for each in codes:
self.send('IRCODE %s\r' % each)
@register("en-US", ".*Change.*Channel.*")
def channelChanger(self, speech, language, matchedRegex):
if language == 'en-US':
answer = self.ask(u"Which channel would you like?")
self.say(u"Ok, one moment..".format(answer))
self.connect()
self.irsend(answer)
self.complete_request()
我得到的错误是:
Traceback (most recent call last):
File "/home/pi/SiriServerCore/plugin.py", line 150, in run
self.__method(self, self.__speech, self.__lang, self.__method.__dict__[__criteria_key__][self.__lang].match(self.__speech))
File "/home/pi/SiriServerCore/plugins/tivoRemote/__init__.py", line 70, in channelChanger
self.irsend(format(answer))
File "/home/pi/SiriServerCore/plugins/tivoRemote/__init__.py", line 61, in irsend
self.send('IRCODE %s\r' % each)
NameError: global name 'self' is not defined
如果我删除'自我'。我得到了同样的错误但是没有定义'send'。
提前感谢您的帮助:) 莱恩
答案 0 :(得分:3)
更有可能工作:
class tivoRemote(Plugin):
def __init__(self):
self.tivo_address = '192.168.0.9'
self.tivo_name = ''
self.tivo_swversions = {}
self.have_zc = True
self.captions_on = False
self.sock = None
self.outer = None
def connect(self):
""" Connect to the TiVo within five seconds or report error. """
try:
sock = socket.socket()
sock.settimeout(5)
sock.connect((tivo_address, 31339))
sock.settimeout(None)
except Exception, msg:
msg = 'Could not connect to %s:\n%s' % (tivo_name, msg)
print(msg)
self.sock = sock
def send(self, message):
""" The core output function, called from irsend(). Re-connect if
necessary (including restarting the status_update thread), send
message, sleep, and check for errors.
"""
if not self.sock:
self.connect()
thread.start_new_thread(status_update, ()) # status_update must be some global at this point
try:
self.sock.sendall(message)
time.sleep(0.1)
except Exception, msg:
error_window(str(msg))
def irsend(self, *codes):
""" Expand a command sequence for send(). """
for each in codes:
self.send('IRCODE %s\r' % each)
@register("en-US", ".*Change.*Channel.*")
def channelChanger(self, speech, language, matchedRegex):
if language == 'en-US':
answer = self.ask(u"Which channel would you like?")
self.say(u"Ok, one moment..".format(answer))
self.connect()
self.irsend(answer)
self.complete_request()
在定义方法时需要使用self
,并且必须使用它来访问当前实例。
答案 1 :(得分:1)
您需要定义所有实例方法(使用self.
访问)并以self
作为第一个参数,您将习惯它:
class tivoRemote(Plugin):
tivo_address = '192.168.0.9'
tivo_name = ''
tivo_swversions = {}
have_zc = True
captions_on = False
sock = None
outer = None
def connect(self):
""" Connect to the TiVo within five seconds or report error. """
global sock
try:
sock = socket.socket()
sock.settimeout(5)
sock.connect((tivo_address, 31339))
sock.settimeout(None)
except Exception, msg:
msg = 'Could not connect to %s:\n%s' % (tivo_name, msg)
print(msg)
def send(self, message):
""" The core output function, called from irsend(). Re-connect if
necessary (including restarting the status_update thread), send
message, sleep, and check for errors.
"""
if not sock:
self.connect()
thread.start_new_thread(status_update, ())
try:
sock.sendall(message)
time.sleep(0.1)
except Exception, msg:
error_window(str(msg))
def irsend(self, *codes):
""" Expand a command sequence for send(). """
for each in codes:
self.send('IRCODE %s\r' % each)
@register("en-US", ".*Change.*Channel.*")
def channelChanger(speech, language, matchedRegex):
if language == 'en-US':
answer = self.ask(u"Which channel would you like?")
self.say(u"Ok, one moment..".format(answer))
self.connect()
self.irsend(answer)
self.complete_request()
此外,如果您希望这些属性属于实例,而不是类(如静态属性),则必须在构造(__init__
中定义它们,这是您最接近构造的内容):
class tivoRemote(Plugin):
def __init__(self):
self.tivo_address = '192.168.0.9'
self.tivo_name = ''
self.tivo_swversions = {}
self.have_zc = True
self.captions_on = False
self.sock = None
self.outer = None
答案 2 :(得分:1)
您正在创建的成员变量属于类而不是实例(您在类中定义变量的方式)。如果要从实例调用send()
之类的方法,那么这些函数的第一个参数必须是self
。您需要修改整个代码,如下所示:
class tivoRemote(..):
def __init__(self):
self.tivo_address = '192.168.0.9'
self.tivo_name = '' #and so on for other members
....
def send(self, msg):
self.connect()
self.sendall(..)
def connect(self, ...):
#self.sock
self.sock = socket.socket()
....
#and similar for all other method that you think is a part of "instance" add the
#first parameter as self
答案 3 :(得分:0)
说明:
class MyThing(object):
"""I am a class definition
Everything here is part of the class definition.
Methods here are classmethods, they are considered "unbound"
When you create an instance of this class like so:
my_instance_of_class_MyThing = MyThing()
the "my_instance_of_class_MyThing" now points to an object.
that object is an instance object.
that object is an instance object of MyThing
the "my_instance_of_class_MyThing" now points to an instance object.
the methods contained in the instance object are NOW "bound" to the instance
bound methods are bound to an instance object
bound methods are sent a reference to the thing they are bound too by
python itself when they are called.
"""
i_am_a_class_attribute = "I am a class attribute"
def __init__(self):
""" I am a method. I start my life as a class method unbound to
any instance. Because I am unbound, when you call me I will
complain to you in the form of an unbound exception call, thus
likely crashing your application.
When you create an instance the class I was defined in,
I will copy a bound copy of myself into the newly created instance.
When you call the bound copy of myself, Python will politely send
a reference of the instance object to the bound method as its
very first argument. Many people name that varible "self". Some use
"me". Others programmers break with convention and use a
single character, but this is rare.
"""
i_am_a_init_local_reference_to =
"this string and only visible with in __init__()"
# self is a variable name python sends to mything_instance.__init__() as the first argument
# self points to the same thing mything_instance points to,
# an INSTANCE of the class MyThing
self.i_am_an_instance_reference_to =
'''this string and is visible to everthing that can access what "self" points too.'''
def proof(self):
try:
print i_am_a_init_local_reference_to
except AttributeError, error_message:
print error_message
else:
print "This won't happen !!"
print "It successfully printed i_am_a_init_local_reference_to"
try:
print self.i_am_an_instance_reference_to
except AttributeError, error_message:
print error_message
else:
print """See proof() can access self.i_am_an_instance_reference_to"""
希望这有助于那些不知道解决方案原因的人。