0

クラスインスタンスへのアクセスに問題があります。プロシージャからクラスを呼び出しています。インスタンスの名前はいくつかの変数で定義されています。その値のインスタンス名を作成してからアクセスしたいのですが、アクセスするとエラーが発生します。誰かがこの問題を解決するのを手伝ってくれませんか。

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

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

mydef()
print a1.name

2番目の問題:実際のスクリプトでは、この関数からこのようなインスタンスを多数作成する必要があります(約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"を変数に割り当てるのではなく、パラメータとして直接使用するだけです
  • グローバル変数で結果を渡す代わりに、関数から何かを返します

RE:コメント

これらのファイルの形式については何も言っていないので、読み取るファイルに1行に1つのクラス名が含まれ、他には何も含まれていない例を示します。

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編集

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:コメント

ああ、あなたは名前でそれらにアクセスしたいです。次に、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:コメント

私があなたを正しく理解しているなら、あなたはそれを両方の方法で持ちたいと思うでしょう-行番号と名前の両方で索引を付けてください。では、リストと辞書の両方を返してみませんか?

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 に答える