3

このクラスがあるとします:

class MyClass(object):
    def uiFunc(self, MainWindow):
        self.attr1 = "foo"
        self.attr2 = "bar"
    def test():
        from subclassfile import MySubClass
        MySubClass.firstFunc(self, 2, 2)

    test()

そして、他のファイルのこのサブクラス:

from classfile import MyClass

class MySubclass(MyClass):
    def firstFunc(self, a, b):
        c = a + b
        d = self.secondFunc(self, c)
        return d

    def secondFunc(self, c):
        d = c / 2
        return d

これはばかげた例ですが、まさに私がやろうとしていることを表しています。最初の関数内のサブクラスから 2 番目の関数を呼び出したい。しかし、それを行うと、 MyClass にはそのような機能がないというエラーが返されます。selfしたがって、呼び出すときに関数名の前に使用するべきではないと思います。しかし、そうしないと、エラーも発生します。

だから私の質問は: サブクラスの最初の関数内でこの 2 番目の関数にアクセスするにはどうすればよいですか?

編集:

助けてくれてありがとう。私の実装はコードで本当に悪いと思いますが、私がやろうとしていることをよりよく説明します。MyClass は、すべてのウィジェットとメイン関数があるコードのメイン クラスです。このクラスには、「テスト」機能にバインドされたボタンもあります。したがって、ボタンを押すと、すべてが機能するはずです。MySubClass ファイルは、データを何らかのファイルにエクスポートする補助モジュールです。firstFunc はこのモジュールのメイン関数で、すべてのデータを処理しますが、secondFunc はファイルのテンプレートを構築するだけです。したがって、テンプレートが読み込まれ、データがファイルに書き込まれるように、firstFunc 内でこの secondFunc を呼び出します。この MySubClass を MyClass から継承して、データベースやその他の変数に MyClass から直接アクセスできるようにしました。

だから私はこれを別の方法で行うことができると思います。しかし、私はこの種の実装についてはあまり経験がありません。また、私の悪い英語で申し訳ありません。

4

3 に答える 3

2

のインスタンスからこのメソッドを呼び出すのではなく、のインスタンスMyClassから呼び出しますMySubclassTypeError問題は、渡した引数(self)が(ではなく)firstFunc間違った型であるため、おそらく取得していることです。解決策は、これが起こらないようにコードを再構築することです。少なくとも、それが問題だと思います(コードを試してみると、あらゆる種類のインポートエラーが発生しました)。これが私が試したコードです(これはあなたが説明している問題を示していると思います):MyClassMySubClass

class MyClass(object):
    def uiFunc(self, MainWindow):
        self.attr1 = "foo"
        self.attr2 = "bar"
    def test(self):
        return MySubClass.firstFunc(self, 2, 2)

class MySubClass(MyClass):
    def firstFunc(self, a, b):
        c = a + b
        d = self.secondFunc(c) #removed self from parameter list
        return d

    def secondFunc(self, c):
        d = c / 2
        return d


a=MyClass()
b=MySubClass()
print (b.test())  #this works because b is the right type to pass to first/second func
a.test()   #This doesn't work because a is the wrong type.

とにかくそこからそれを使用することができないのでtest、方法として持つことは実際には意味がないことに注意してください。に移動した方がよいでしょう。MyClasstestMySubClass

また、他の人が指摘しているように、self.secondfunc(self,c)これも非常に奇妙です。これは基本的に、 2回MySubClass.secondfunc(self,self,c)渡すため、引数の数が間違っているのと同じです。self

これは機能します:

class MyClass(object):
    def uiFunc(self, MainWindow):
        self.attr1 = "foo"
        self.attr2 = "bar"
    def test(self):
        return firstFunc(self, 2, 2)


def firstFunc(self, a, b):
    c = a + b
    d = secondFunc(self,c) #self from in front of function, now in parameter list
    return d

def secondFunc(self, c):
    d = c / 2
    return d

class MySubClass(MyClass):
    firstFunc=firstFunc
    secondFunc=secondFunc


a=MyClass()
b=MySubClass()
print (b.test())
print (a.test())

ただし、コードを再構築することを強くお勧めします。

于 2012-06-18T12:41:55.320 に答える
2

変化する:

d = self.secondFunc(self, c)

に:

d = self.secondFunc(c)
于 2012-06-18T12:37:27.893 に答える
1

firstFuncインスタンスメソッドの場合、静的メソッドであるかのように呼び出そうとしています。デコレーターを使用してclassmethod、静的メソッドの効果を実現できます。

于 2012-06-18T12:37:51.970 に答える