2013-06-24 4 views
0

목록이 처리 될 때 콘텐츠 블록 '인스턴스'의 목록이 있습니다. 각 블록의 콘텐츠가 콘텐츠 유형 클래스 그것이 의미가있는 경우).Python : 다른 클래스 인스턴스의 출력에서 ​​클래스 인스턴스의 속성을 설정하려고 시도했습니다.

목록을 반복하면서 extra_modules에서 명명 된 모듈의 인스턴스에서 출력 된 모듈 인스턴스의 특성을 설정하려고합니다. 이 질문을 작성하는 더 좋은 방법이 있다면 언제든지 편집하십시오.

다음은 Python Bottle 프레임 워크를 사용하여 실행하려고하는 테스트 코드의 예입니다. 실제로 photoGallery 클래스에 코드를 생성하는 코드를 넣기 전에 테스트 출력을 얻으려고합니다.

core.py :

import extra_modules 

module_blocks_in_db = [ 
    # module-ID, module-sys-name, module-sys-desc, module-function, module-variables 
    [1, 'photo_gallery_main', 'A little intro gallery', 'photoGallery', '{"images": ["photo1.jpg", "photo2.jpg", "photo3.jpg"]}'], 
] 


class moduleBlocks: 
    def __init__(self, mbidb): 
     for i in mbidb: 
      setattr(self, i[1], getattr(extra_modules, i[3])(i[4])) 


@route('/') 
def home(): 
    page_id = 1 
    modules = moduleBlocks(module_blocks_in_db) 
    return modules.photo_gallery_main 

extra_modules.py : 정말이야

File "core.py", line 46, in __init__ 
setattr(self, i[1], getattr(extra_modules, i[3])(i[4])) 
TypeError: __init__() should return None 

:

class photoGallery: 
    def __init__(self, *args): 
     self.output = 'Output from photoGallery class instance' 
     return self.output 

이 내가 병의 개발 서버에서지고있어 오류가 이 오류를 잘 이해하지 못하면서 코드를 더 많이 볼수록 혼란 스럽습니다. 클래스 인스턴스의 출력을 잡아 내 예제에서 moduleBlocks 클래스의 특성으로 할당하려면 여러 가지 방법을 시도했습니다. 내가 이걸 어디서 잘못 먹었습니까?

편집 : 지금 두 개의 별도의 라인에 나의 않은 setattr 라인을 변경하고 extra_modules의 포토 갤러리 클래스에서 반환 출력을 제거있어 사물이 지금 잘, 감사 작업 :

x = getattr(extra_modules, i[3])(i[4]) 
setattr(self, i[1], x.output) 
+0

이 줄로 할거야? – mbatchkarov

+0

getattr을 사용하여 photoGallery 클래스의 인스턴스를 생성합니다.이 인스턴스는 def __init__에서 콘텐츠를 생성하고이 인스턴스를 반환합니다. 산출. 그런 다음 해당 출력으로 moduleBlocks 인스턴스의 관련 특성을 설정하려고합니다. –

답변

2

다음은 잘못된이다 :

class photoGallery: 
    def __init__(self, *args): 
     self.output = 'Output from photoGallery class instance' 
     return self.output 

"_ 초기화하기 _의"포토 갤러리 객체를 초기화하는의 책임이 포토 갤러리의 생성자입니다. 그렇기 때문에 아무것도 반환하지 않는 것이 좋습니다. return self.output을 없애고 다시 시도하십시오.

+0

그래서 self.output이 설정되었지만,이 줄에서 self.output의 값을 반환하는 방법 :'setattr (self, i [1], getattr (extra_modules, i [3]) (i [4]))' –

+0

@ zilog6502 :'photoGallery' 객체 자체가 그 호출의 결과물입니다. 너 뭐하려고? –

0

좋아, 네가하려는 일이 무엇인지 알 것 같아. 그 접근법이 말하기에는 문제가있다. 문제는 각 클래스 출력 변수에 액세스하는 것이 중요합니다. 생성하는 모든 컨트롤러 클래스는 출력 변수를 정의해야하며 각 컨트롤러가 출력 변수를 정의해야한다는 것을 문서화해야합니다.

문제를 해결할 수있는 해결책이 몇 가지 있으며 일부는 다른 것보다 낫습니다.

그래서 여기에 몇 가지 옵션이 있습니다.

  1. 정말 포토 갤러리가 수업으로 필요합니까? 모든 것이 문자열을 반환하고 상호 작용이나 상태 변경이 없다면 클래스가 될 수 없다. 그것 및 유사한 관제사를 기능 및 thats 당신이 할 필요가있는 전부 바꾸십시오.

  2. 어쩌면 거기에 어떤 상태 변화가 생겨서 다른 곳으로 옮겨지는 것이 좋습니다. 파이썬에는 인터페이스가 없지만 abc (추상 기본 클래스)가 있습니다. 당신은 모든 컨트롤러를 abc로부터 상속 받아 get_ouput과 같은 메소드를 정의 할 수 있습니다.다음 것 :

    않은 setattr (. 자기, 내가 [1], getattr (extra_modules, 내가 [3]) (전 [4]) get_output을())

  3. 이를 같이하지 않는 것이 좋습니다의 정말 불쾌하고 나중에 비트 것입니다 : 당신이하려고하는 어떤

    않은 setattr (자기, 내가 [1], getattr (extra_modules, 내가 [3]) (전 [4]) 출력.)

+0

나는 귀하의 솔루션 중 1 위를 좋아합니다. 나는 클래스를 사용하여 작업을 할 수 있었고, 플러그인 시스템과 같은 클래스를 사용하고 싶었 기 때문에 이런 식으로 방향을 잡았다. 그러나 나는 함수의 단순성을 정말 좋아한다. –