在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
注意这些变化:
- 类名应大写
- 使用
作为类的基类(从python 2.2开始,但在3.x中不再需要)object
- 不要用您的参数名对内置的
对象进行阴影处理
- 只需将字符串
直接用作参数,而不是将其分配给变量“a1”
- 从函数中返回某些内容,而不是通过全局变量传递结果
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
注意这些变化:
- 类名应大写
- 使用
作为类的基类(从python 2.2开始,但在3.x中不再需要)object
- 不要用您的参数名对内置的
对象进行阴影处理
- 只需将字符串
直接用作参数,而不是将其分配给变量“a1”
- 从函数中返回某些内容,而不是通过全局变量传递结果
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之前,我必须将从文件中获取的值存储在另一个变量中