2013-07-25 3 views
0

코드에 다음과 같은 클래스 구조가 있습니다.
기본적으로 하위 클래스 B의 개체 목록 인 A는 수퍼 클래스 인 A 클래스입니다. meth는 변수 var를 생성합니다 (파일에서 읽음). 변수 var는 서브 클래스 B의 메소드에 의해 접근 할 수 있어야합니다. 문제는 a = A()를 초기화 한 후에 var는 인스턴스 a의 속성으로 super (). var는 float (1e5 요소 주위)의 큰 배열이므로 B (n 번!) 인스턴스의 속성으로 사용하지 않거나 명시 적으로 methB에 전달하여 메모리 사용을 최소화하려고합니다.하위 클래스 메서드에서 수퍼 클래스 인스턴스의 특성에 액세스하는 방법

class A(object): 
    def __init__(self,n): 
    self.data = [B() for _ in xrange(n)] 

    def __getitem__(self,n): 
    return self.data[n] 

    def methA(self): 
    with open('file.txt','r') as fp: 
     self.var = fp.readlines() 

class B(A): 
    def __init__(self): 
    self.derived_var = [] 

    def methB(): 
    '''This method needs to use var defined in meth of A above.''' 

a = A(5) 
a.methA() 
for b in A: 
    b.methB() 

파이썬으로 가능합니까? 아니면 나쁜 코딩입니까?

답변

0
def methB(self): 
    super(B, self).meth() 
    print self.var 

super()을 사용하면 수퍼 클래스에 정의 된 속성을 얻을 수 있습니다. 그러나 상속은 is-one 관계 여야합니다. 당신의 디자인이 좋지 않습니다.

1

우선 A의 하위 클래스로 B을 정의하는 지점이 표시되지 않습니다. 그것들은 기능을 공유하지 않는 것 같고 BA (생성자가 A) 사이에 순환 참조를 만들면 문제가 발생할 수 있습니다.

이제 귀하의 질문입니다. a.varmethB에 전달하는 것이 문제입니까? 이처럼 :

class B(A): 
    def __init__(self): 
    self.derived_var = [] 

    def methB(self, var): 
    # some code 

a = A(5) 
a.meth() 
for b in A: 
    b.methB(a.var) 
+0

답변 해 주셔서 감사합니다. 후속 질문 : 함수/메소드에 대량의 배열을 전달하면 실제로 포인터 나 배열 자체를 전달합니다. 즉, 함수를 여러 번 호출하면 내 기억이 질식 될 염려가 있습니까? – astroMonkey

+0

@ user1098683 파이썬의 모든 것은 참조를 통해 전달됩니다. 당신은 그것에 대해 걱정할 필요가 없습니다. – freakish

0

기능이 충분하면 클래스를 사용하지 마십시오

with open('file.txt','r') as fp: 
    var = fp.readlines() 

for _ in xrange(5): 
    funcB() 

을 그래서 훨씬 더 간단합니다. 을 수행하는 경우 수업을 사용하려면 수업을 사용하는 것이 바람직한 이유를 보여 주어야합니다.

+2

-1 : 그는 왜 그가 수업을 사용하는지 우리에게 보여줄 필요가 없습니다. 이것은 질문과 관련이 없습니다. 그리고 당신의 대답은 전혀 대답이 아닙니다. – freakish

+1

B가 A의 하위 클래스이고 A가 B의 목록을 포함하는 이유를 분명히하지 않았을 때 어떻게 적절한 클래스 기반 솔루션을 제공 할 수 있습니까? 상속이나 작곡을 사용해야할까요? 한 반은 충분하니? 'var'을 클래스 속성이나 메모 값으로 만드는 대신'methA'에'self.var'를 정의하는 이유는 무엇입니까? 가능한 많은 솔루션이 있으므로 자세한 내용을 알지 못해도 좋은 솔루션을 제공하는 것은 불가능합니다. 이 기능이 없으면 나쁜 디자인에 대한 임시 솔루션을 제공 할 가능성이 큽니다. 그가 그 세부 사항을 줄 때까지 가장 좋은 해결책은 가장 단순합니다. 그것은 전혀 수업이 아닙니다. – unutbu

관련 문제