2012-09-19 7 views
0

임 아래에이 코드 조각을 시도하지만이 작동하지 않는 이유를 궁금해 ..파이썬 객체 지향 구현

code.py

class Example(): 


    def A1(self): 
     return self.B1() + self.B2() 


    def B1(self): 
     return 4 * self.C1() 

    def B2(self): 
     return 5 

    def C1(self): 
     return 2 


def main(): 
    spreadsheet = Example() 
    print spreadsheet.A1() 

    spreadsheet.C1 = 3 
    print spreadsheet.A1() 
+4

작동하지 않는 기능을 설명하십시오. 무엇을하고 싶습니까? 대신 무엇이 발생합니까? – BrenBarn

+0

C1이 이미 정의 된 함수가 아닙니까? 어떻게 그것을 변수로 참조 해제하고 값을 할당하려고합니까? –

+0

스프레드 시트 C1을 값 3으로 만드는 이유는 무엇입니까? –

답변

1

당신은 당신이 주요 실행하는 경우는 인스턴스 변수 C1을 덮어 쓰기 때문이다()

spreadsheet.A1를 인쇄 할 얻을 때 당신이 형식 오류를 얻을 것을 의미한다. 함수에 할당되었지만 정수 3에 다시 할당합니다. 인스턴스 메서드 A1을 처리하려고하면 결국 self.C1()을 호출하고 호출 할 수없는 정수를 찾습니다. 그 뒤에 괄호가 있으므로 제대로 오류가 발생합니다.

원하는대로 여러 가지 옵션이 있습니다.

  • 정상적인 동작이며 인스턴스 절차를 덮어 쓰지 마십시오.
  • C1에 대한 설정자를 정의하십시오. 그 시점에서 오류를 반환하거나 아무 것도하지 않습니다.
4

C1은 메소드로 시작합니다. .C1()을 호출하는 .B1()을 호출하는 .A1()을 호출합니다. 반환 값은 2입니다. 지금까지는 그렇게 좋았습니다.

다음에 .C1()을 호출하는 .B1()을 호출하는 .A1()을 호출합니다. 값 3을 호출 할 수 없으므로 .C1()이 호출됩니다. .

은 아마 당신은

class Spreadsheet(object): 
    def __getattribute__(self, cell): 
     val = object.__getattribute__(self, cell) 
     return val(self) if callable(val) else val 

def main(): 
    s = Spreadsheet() 

    s.a1 = lambda self: self.b1 + self.b2 
    s.b1 = lambda self: 4 * self.c1 
    s.b2 = 5 

    s.c1 = 2 
    print s.a1 # => 13 

    s.c1 = 3 
    print s.a1 # => 17 
+0

나는 그가 단순한 대답을 찾고 있다고 생각합니다. –

+0

@AaronH.: 그의 예제가 실제 문제를 얼마나 잘 나타내고 있는지를 짐작하기는 어렵지만 주어진 예제의 경우 훨씬 간단 해지지 않습니다. –

1

이름 "C1"는 방법을 말한다 (호출 가능한 객체) 같은 것을 원한다. 그런 다음 "C1"속성을 정수 (호출 가능하지 않음)에 할당하고 메서드를 클리핑합니다. 그런 다음 self.C1()으로 전화하면 더 이상 작동하지 않습니다.

2

변수에서 C1 변수는 인스턴스 메서드를 포함하는 변수 일뿐입니다. 3과 같게 설정하면 함수가 재정의됩니다. 예를 들어

:

def foo(): 
    print 4 

foo = 12 # foo is now the number 12, not a function 

당신은 같은 일을했다 :

spreadsheet.C1 = 3 

C1

함수했다,하지만 지금은 숫자입니다. 전화를 걸 수 없습니다.