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

4 に答える 4

4

C1はメソッドとして始まります。.A1()を呼び出し、.B1()を呼び出し、.C1()を呼び出し、2を返します。これまでのところ、非常に優れています。

次に、.C1を値(3)にします。.A1()を呼び出し、.B1()を呼び出し、.C1()を呼び出そうとします。これは、値3が呼び出せないために爆発します。

多分あなたは次のようなものが欲しい

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
于 2012-09-19T21:52:03.010 に答える
2

あなたのクラスでは、変数C1はインスタンスメソッドを保持する単なる変数でした。に等しく設定すると3、関数がオーバーライドされます。

例えば:

def foo():
  print 4

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

あなたは同じことをしました:

spreadsheet.C1 = 3

C1 関数でしたが、今では数字になっています。番号を呼び出すことはできません。

于 2012-09-19T21:55:43.463 に答える
1

「C1」という名前は、メソッド(呼び出し可能なオブジェクト)を指します。ただし、次に「C1」属性を整数(呼び出し不可)に割り当て、メソッドをクローバーします。それからあなたがそれでそれを呼ぶとき、self.C1()それはもう働きません。

于 2012-09-19T21:52:10.007 に答える
1

mainを実行すると、スプレッドシートを印刷するときにTypeErrorが発生することを意味します。A1()

インスタンス変数C1を上書きするためです。関数に割り当てられましたが、整数3に再割り当てします。インスタンスメソッドA1を処理しようとすると、最終的にself.C1()を呼び出そうとし、呼び出すことができない整数を見つけます。その後に括弧が付いているので、適切にエラーがスローされます。

何をしたいかに応じて、いくつかのオプションがあります。

  • これは正常な動作であり、インスタンスプロシージャを上書きしないことを受け入れます。
  • その時点でエラーを返すか、サイレントに何もしないC1のセッターを定義します。
于 2012-09-19T22:04:55.987 に答える