Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类TypeError:非序列上的迭代_Python_Class - Fatal编程技术网

Python类TypeError:非序列上的迭代

Python类TypeError:非序列上的迭代,python,class,Python,Class,我在file1.py中有以下类 class api: def server(self): DEFAULT_SERVER = socket.gethostname() try: SATELLITE_SERVER = raw_input('Enter RedHat Satellite Server Name [%s]: ' % DEFAULT_SERVER) except KeyboardInterrupt: print "" sys.

我在file1.py中有以下类

class api:
  def server(self):
    DEFAULT_SERVER = socket.gethostname()
    try:
      SATELLITE_SERVER = raw_input('Enter RedHat Satellite Server Name [%s]: ' % DEFAULT_SERVER)
    except KeyboardInterrupt:
      print ""
      sys.exit(1)
    if not SATELLITE_SERVER:
      SATELLITE_SERVER = DEFAULT_SERVER
    try:
      SATELLITE_URL = 'http://' + SATELLITE_SERVER + '/rpc/api'
      CLIENT = xmlrpclib.Server(SATELLITE_URL, verbose=0)
      print "Welcome to RedHat Satellite Server %s" % CLIENT.api.systemVersion()
    except socket.error, e:
      print "Incorrect Server Name -", e
      sys.exit(1)
    return CLIENT

  def username(self):
    DEFAULT_LOGIN = getpass.getuser()
    try:
      SATELLITE_LOGIN = raw_input("Enter RedHat Satellite Login Name [%s]: " % DEFAULT_LOGIN)
    except KeyboardInterrupt:
      print ""
      sys.exit(1)
    if not SATELLITE_LOGIN:
      SATELLITE_LOGIN = DEFAULT_LOGIN
    return SATELLITE_LOGIN

  def password(self):
    try:
      SATELLITE_PASSWORD = getpass.getpass("Enter Your Password: ")
    except KeyboardInterrupt:
      print ""
      sys.exit(1)
    if not SATELLITE_PASSWORD:
      self.password()
    return SATELLITE_PASSWORD

  def __init__(self):
    CLIENT = self.server()
    SATELLITE_LOGIN = self.username()
    SATELLITE_PASSWORD = self.password()
    KEY = CLIENT.auth.login(SATELLITE_LOGIN, SATELLITE_PASSWORD)

  def __new__(self):
    return (self.KEY, self.CLIENT)
我在file2.py中调用这个类

KEY, CLIENT = file1.api()
print KEY
print CLIENT
当我执行file2.py时,我得到了错误

Traceback (most recent call last):
  File "./test.py", line 24, in <module>
    KEY, CLIENT = satelliteapi.api()
TypeError: iteration over non-sequence
回溯(最近一次呼叫最后一次):
文件“/test.py”,第24行,在
KEY,CLIENT=satellitapi.api()
TypeError:非序列上的迭代

我不确定我做错了什么,可能是因为从类中重新调整了值,可能是新的,在这种情况下,返回的方式不正确。请帮助。

从本质上讲,覆盖
\uuuuu new\uuuu
是你应该做的事情。如果您只是想轻松地解压
客户端
值,可以执行以下操作:

class api(object):
....
def __iter__(self):
    return (value for value in (self.KEY, self.CLIENT))
\uuuu iter\uuuu
是一种特殊的方法,用于定义类是否可以迭代。它返回一个
迭代器
实例(在本例中为
生成器
),该实例可用作对象的“序列”表示。对这个话题有很好的解释

如果您想使其更加明确,可以执行以下操作:

class api(object):
....
def get_key_and_client(self):
    return self.KEY, self.CLIENT
def __iter__(self):
    return (value for value in self.get_key_and_client())

这使您无需实际使用迭代器即可获得相同的信息,并使迭代器成为
get\u key\u and\u client()
方法的别名。

satellitapi.api()返回什么?这是什么版本的python?
satellitapi
来自哪里?还有什么是
self.KEY
self.CLIENT
?类实例化应该始终返回类的实例(如您所想象的)。如果你只是想要元组,为什么不使用一个函数来创建两个对象(客户机和键)并返回它们,而不是一个类呢?抱歉@Hoopdady和Padraic,这是一个拼写错误,我已经纠正了。这是file1.api()遇到了一个错误
TypeError:\uuuuuIter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我将答案编辑为正确答案,但肯定有一个方法符合javidcf的答案,或者我的第二个示例是更清晰的选项。