0

我在访问类实例时遇到了一些问题。我从一个过程中调用这个类,实例的名称是在某个变量中定义的。我希望使用该值创建实例名称,然后想要访问它,但是当我访问它时会出错。有人可以帮助解决这个问题。

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"
4

2 回答 2

3

这就是我的做法。我不知道你为什么要搞乱全局变量,如果你愿意解释,我会更新我的答案。

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 中不再需要)
  • object不要使用您的参数名称隐藏内置
  • 只需将字符串"a1"直接用作参数,而不是将其分配给变量
  • 从函数返回一些东西,而不是通过全局变量传递结果

回复:评论

你没有说这些文件的格式,所以我只举一个例子,其中要读取的文件每行包含一个类名,仅此而已:

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))

回复:OP 编辑

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")

回复:评论

哦,您想按名称访问它们。然后返回 a 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"

回复:评论

如果我对您的理解正确,您希望两种方式都有 - 按行号和名称索引。那么你为什么不同时返回一个列表和一个字典呢?

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"])
于 2012-08-02T10:39:05.053 回答
0

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

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'))
于 2012-08-02T10:55:44.437 回答