2012-08-02 3 views
0

클래스 인스턴스에 액세스 할 때 문제가 있습니다. 프로 시저에서 클래스를 호출 할 때 인스턴스의 이름은 일부 변수에 정의됩니다. 인스턴스 이름을 해당 값으로 만든 다음 액세스하려고하지만 액세스 할 때 오류가 발생합니다. 이 문제를 해결할 수있는 사람이 있습니까?파이썬에서 클래스 개체에 액세스하는 중 오류가 발생했습니다.

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

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

mydef() 
print a1.name 

두 번째 문제 : 내 실제 스크립트에서, 나는 (약 100)이 함수에서 이러한 경우 많은 수의를 만들어야합니다. 그래서 그들의 이름을 global로 정의하는 것은 고통 스럽습니다. 전역으로 선언 할 필요없이 함수 밖의 인스턴스에 액세스 할 수있는 방법이 있습니까?

수정 : 나는 그것을 할 거라고 방법

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" 
+0

를 들어, 인스턴스 저장소로 클래스를 사용할 수 있습니다; 'mydef()'가 선언되고있는 레벨이 아닌지는 명확하지 않습니다. 서식 지정에 대한 도움말은 [내 코드 블록의 형식은 어떻게 지정합니까?] (http://meta.stackexchange.com/q/22186) –

+0

mydef와 클래스 선언은 같은 수준입니다. – sarbjit

+0

나는이 질문을 롤백했다. 허용 된 답변에 일부 누락 된 컨텍스트가있었습니다 (업데이트 내역을 저장하는 '전역'을 사용하고있는 곳을 보지 못했습니다). – Makoto

답변

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 : 당신은이 파일의 형식에 대해 아무것도 말했다하지 않은

코멘트, 그래서 난 그냥 파일이 하나의 클래스 이름 한 줄에 포함 읽을 수 있도록 예제를 제공하지 않으며, 아무것도 것이다 :

0 당신은 여러 파일이 큰 목록에 모든 파일에서 모든 인스턴스를 추가 할 그렇다면
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"]) 
+0

사실 내 원래 스크립트에서 mydef는 호출 할 때 파일을 열고 파일의 내용대로 파일에서 읽은 값을 기반으로 인스턴스 이름을 만드는 함수에 해당합니다. 또한 (파일 텍스트의 일부 키워드에 따라) 해당 함수 내에서 호출해야하는 여러 클래스가있을 것입니다. 그래서 내가 파일에서 정의 된 텍스트에서 인스턴스 이름을 추출해야하기 때문에 당신이 사용하는 반환 문을 사용할 수 없습니다. – sarbjit

+0

당신의 도움을 위해, 내 수정 된 코드를 참조하십시오. 클래스 정의를 호출하기 전에 파일에서 가져온 값을 다른 변수에 저장해야한다는 것을 알 수 있습니다. – sarbjit

+0

@sarbjit 그렇게하는 것은 문제가되지 않습니다. 처음에는 보여준 코드에서 불필요한 것입니다. 인스턴스 목록을 반환하도록 코드를 수정하면됩니다. –

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')) 
관련 문제