Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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中访问类对象时出错_Python_Class_Object - Fatal编程技术网

在python中访问类对象时出错

在python中访问类对象时出错,python,class,object,Python,Class,Object,我在访问类实例时遇到一些问题。我从一个过程调用这个类,实例的名称在某个变量中定义。我希望为该值创建实例名称,然后希望访问它,但当我访问它时,它给出了错误。有人能帮忙解决这个问题吗 class myclass: def __init__(self,object): self.name = object def mydef(): global a1 b = "a1" b = myclass(b) mydef() print a1.name 第二个问题: 在我的实际

我在访问类实例时遇到一些问题。我从一个过程调用这个类,实例的名称在某个变量中定义。我希望为该值创建实例名称,然后希望访问它,但当我访问它时,它给出了错误。有人能帮忙解决这个问题吗

class myclass:
  def __init__(self,object):
    self.name = object

def mydef():
   global a1
   b = "a1"
   b = myclass(b)

mydef()
print a1.name
第二个问题: 在我的实际脚本中,我必须从这个函数创建大量这样的实例(大约100个)。因此,将它们的名称定义为全局将是一件痛苦的事情,是否有一种方法可以在函数外部访问这些实例,而不必将它们声明为全局实例

修改:

class myclass:
    def __init__(self,object,typename):
        self.name = object
        self.typeid = typename

def mydef():
    file_han = open(file,"r")
    while True:
      line = file_han.readline()
      if not line:
        break
      start = line.find('"')
      end = line.find('"',start+1)
      string_f = line[start+1:end]
      myclass(string_f,'a11')        

mydef(file)

print def.name
print def.typeid

File Contents are :
a11 "def"
a11 "ghi"
a11 "eff"

我会这样做的。我不知道你为什么和全球人混在一起,如果你愿意解释的话,我会更新我的答案

class Myclass(object):
    def __init__(self, name):
        self.name = name

def mydef():
   return Myclass("a1")

a1 = mydef()
print a1.name
在列表中收集您的实例:

instances = []
for x in range(1000):
    instances.append(Myclass("Instance {0}".format(x)))
print instance[42].name
注意这些变化:

  • 类名应大写
  • 使用
    object
    作为类的基类(从python 2.2开始,但在3.x中不再需要)
  • 不要用您的参数名对内置的
    对象进行阴影处理
  • 只需将字符串
    “a1”
    直接用作参数,而不是将其分配给变量
  • 从函数中返回某些内容,而不是通过全局变量传递结果
RE:Comment

def mydef(filename):
    ret = []
    with open(filename, "r") as file_han:
        for line in file_han:
            string_f = line.split('"')[1]
            ret.append(Myclass(string_f))
    return ret

i = mydef("name_of_file")
您没有提到这些文件的格式,因此我只给出一个示例,其中要读取的文件每行包含一个类名,而没有其他内容:

def mydef(filename):
    ret = []
    with open(filename) as f:
        for line in f:
            # Call `strip` on line to remove newline and surrounding whitespace
            ret.append(Myclass(line.strip()))
    return ret
因此,如果您有多个文件,并且希望将所有文件中的所有实例添加到一个大列表中,请执行以下操作:

instances = []
for filename in ["myfile1", "myfile2", "myfile3"]:
    instances.extend(mydef(filename))
RE:OP-Edit

def mydef(filename):
    ret = []
    with open(filename, "r") as file_han:
        for line in file_han:
            string_f = line.split('"')[1]
            ret.append(Myclass(string_f))
    return ret

i = mydef("name_of_file")
RE:Comment

def mydef(filename):
    ret = []
    with open(filename, "r") as file_han:
        for line in file_han:
            string_f = line.split('"')[1]
            ret.append(Myclass(string_f))
    return ret

i = mydef("name_of_file")
哦,你想通过名字访问它们。然后返回一个
dict

def mydef(filename):
    ret = {}
    with open(filename, "r") as file_han:
        for line in file_han:
            string_f = line.split('"')[1]
            ret[string_f] = Myclass(string_f)
    return ret

i = mydef("name_of_file")
print i["ghi"].name  # should print "ghi"
RE:Comment

def mydef(filename):
    ret = []
    with open(filename, "r") as file_han:
        for line in file_han:
            string_f = line.split('"')[1]
            ret.append(Myclass(string_f))
    return ret

i = mydef("name_of_file")
如果我没弄错的话,你希望它有两种方式——按行号和名称索引。那你为什么不同时返回一个列表和一本字典呢

def mydef(filename):
    d = {}
    L = []
    with open(filename, "r") as file_han:
        for line in file_han:
            string_f = line.split('"')[1]
            instance = Myclass(string_f)
            d[string_f] = instance
            L.append(instance)
    return L, d

L, d = mydef("name_of_file")
print d["ghi"].name
print L[3]
print L.index(d["ghi"])

我会这样做的。我不知道你为什么和全球人混在一起,如果你愿意解释的话,我会更新我的答案

class Myclass(object):
    def __init__(self, name):
        self.name = name

def mydef():
   return Myclass("a1")

a1 = mydef()
print a1.name
在列表中收集您的实例:

instances = []
for x in range(1000):
    instances.append(Myclass("Instance {0}".format(x)))
print instance[42].name
注意这些变化:

  • 类名应大写
  • 使用
    object
    作为类的基类(从python 2.2开始,但在3.x中不再需要)
  • 不要用您的参数名对内置的
    对象进行阴影处理
  • 只需将字符串
    “a1”
    直接用作参数,而不是将其分配给变量
  • 从函数中返回某些内容,而不是通过全局变量传递结果
RE:Comment

def mydef(filename):
    ret = []
    with open(filename, "r") as file_han:
        for line in file_han:
            string_f = line.split('"')[1]
            ret.append(Myclass(string_f))
    return ret

i = mydef("name_of_file")
您没有提到这些文件的格式,因此我只给出一个示例,其中要读取的文件每行包含一个类名,而没有其他内容:

def mydef(filename):
    ret = []
    with open(filename) as f:
        for line in f:
            # Call `strip` on line to remove newline and surrounding whitespace
            ret.append(Myclass(line.strip()))
    return ret
因此,如果您有多个文件,并且希望将所有文件中的所有实例添加到一个大列表中,请执行以下操作:

instances = []
for filename in ["myfile1", "myfile2", "myfile3"]:
    instances.extend(mydef(filename))
RE:OP-Edit

def mydef(filename):
    ret = []
    with open(filename, "r") as file_han:
        for line in file_han:
            string_f = line.split('"')[1]
            ret.append(Myclass(string_f))
    return ret

i = mydef("name_of_file")
RE:Comment

def mydef(filename):
    ret = []
    with open(filename, "r") as file_han:
        for line in file_han:
            string_f = line.split('"')[1]
            ret.append(Myclass(string_f))
    return ret

i = mydef("name_of_file")
哦,你想通过名字访问它们。然后返回一个
dict

def mydef(filename):
    ret = {}
    with open(filename, "r") as file_han:
        for line in file_han:
            string_f = line.split('"')[1]
            ret[string_f] = Myclass(string_f)
    return ret

i = mydef("name_of_file")
print i["ghi"].name  # should print "ghi"
RE:Comment

def mydef(filename):
    ret = []
    with open(filename, "r") as file_han:
        for line in file_han:
            string_f = line.split('"')[1]
            ret.append(Myclass(string_f))
    return ret

i = mydef("name_of_file")
如果我没弄错的话,你希望它有两种方式——按行号和名称索引。那你为什么不同时返回一个列表和一本字典呢

def mydef(filename):
    d = {}
    L = []
    with open(filename, "r") as file_han:
        for line in file_han:
            string_f = line.split('"')[1]
            instance = Myclass(string_f)
            d[string_f] = instance
            L.append(instance)
    return L, d

L, d = mydef("name_of_file")
print d["ghi"].name
print L[3]
print L.index(d["ghi"])

例如,您可以使用类作为实例的存储库

class Named(object):
    def __init__(self,name):
        self.name = name

    def __new__(cls,name):
        instance = super(type,cls).__new__(cls,name)
        setattr(cls,name,instance)
        return instance

    def __repr__(self):
        return 'Named[%s]'%self.name

Named('hello')
Named('x123')
Named('this is not valid attribute name, but also working')

print(Named.hello,Named.x123,getattr(Named,'this is not valid attribute name, but also working'))

例如,您可以使用类作为实例的存储库

class Named(object):
    def __init__(self,name):
        self.name = name

    def __new__(cls,name):
        instance = super(type,cls).__new__(cls,name)
        setattr(cls,name,instance)
        return instance

    def __repr__(self):
        return 'Named[%s]'%self.name

Named('hello')
Named('x123')
Named('this is not valid attribute name, but also working')

print(Named.hello,Named.x123,getattr(Named,'this is not valid attribute name, but also working'))

你需要修正你的缩进;例如,不清楚应该在哪个级别声明
mydef()
。有关格式设置的帮助,请参阅mydef和类声明处于同一级别。我已将此问题回滚。接受的答案中缺少一些上下文(没有看到您在哪里使用
globals
save for revision history)。您需要修复缩进;例如,不清楚应该在哪个级别声明
mydef()
。有关格式设置的帮助,请参阅mydef和类声明处于同一级别。我已将此问题回滚。接受的答案缺少一些上下文(没有看到您在哪里使用
globals
save以保存修订历史记录)。实际上,在我的原始脚本中,mydef对应于一个函数,调用该函数时将打开一个文件,并根据文件内容,根据从文件读取的值创建实例名称。此外,我将有多个类,需要在该函数内调用(取决于文件文本中的某些关键字)。因此,我不能像您使用的那样使用return语句,因为我需要从file.thx中定义的文本中提取实例名称。为了您的帮助,请查看我修改的代码,因为您可以看到,在调用类定义之前,我必须将从文件中提取的值存储在另一个变量中。@sarbjit这样做没有问题,只是在你第一次展示的代码中它是不必要的。只要修改您的代码以返回实例列表,就可以了。我尝试返回列表,但似乎不起作用,看起来我缺少了一些内容。@sarbjit我看到了您更新的代码。实际上,您需要
返回函数底部的列表,并且需要将其分配给变量,如
instances=mydef(file)
。我强烈建议您查看,因为您似乎对一些基本的python概念缺乏了解。实际上,在我的原始脚本中,mydef对应于一个函数,调用该函数时将打开一个文件,并根据文件内容,根据从文件读取的值创建实例名称。此外,我将有多个类,需要在该函数内调用(取决于文件文本中的某些关键字)。因此,我不能像您使用的那样使用return语句,因为我需要从file.thx中定义的文本中提取实例名称。为了您的帮助,请查看我修改的代码,因为您可以看到,在调用类defini之前,我必须将从文件中获取的值存储在另一个变量中