-1

私はこれに対する答えを探していましたが、まだ運がありません。子クラスが親クラスのプロパティの値にアクセスする必要があります。

次に例を示します。

class myclass:
    def __init__(self):

        class __firstinternal__:
            def __init__(self):
                self.second = __secondinternal__()

        class __secondinternal__:
            def __init__(self):
                self.var = myclass.getString()

    def getString(self):
        return "something"

    self.internal = __firstinternal__()
    print self.internal.second.var

c = myclass()
Traceback (most recent call last):
  File "./inheritest.py", line 19, in <module>
    c = myclass()
  File "./inheritest.py", line 15, in __init__
    self.internal = __firstinternal__()
  File "./inheritest.py", line 7, in __init__
    self.second = __secondinternal__()
  File "./inheritest.py", line 11, in __init__
    self.anothervar = myclass.getString()
AttributeError: class myclass has no attribute 'getString'

つまり、親 myclass からメソッド getString() を継承するには、secondinternalが必要です。

クラスが子ではない場合にこれを行う方法を見つけましたが、2 つのクラスを非公開にしたいと考えています。

何か案は?

前もって感謝します!

4

2 に答える 2

2

「子クラス」と「親クラス」の意味が明確ではありません。別のクラス内でクラスを定義することは、通常の Python パターンではありません。これらの用語をどのように使用しているかについて、さらに説明する必要があります。また、投稿されたコードでは説明したエラーが発生しないため、実行中のコードとは異なるコードを投稿しているようです。

あなたのコードに基づいて私ができる最善の答えは、「あなたがやろうとしていることはできない」です。のメソッド__firstinternal__内で定義すると、 への参照がないため、そのメソッドまたはそのメソッドにアクセスできません。 すべてのメソッドが定義されるまで存在しないため、クラス定義時にメソッド内の何もクラス定義の他の部分にアクセスできません。を介して実行時にアクセスできますが、これは機能しないと言われていますが、前述のように、指定したエラーはコードが実際に行うことではないため、これは無意味です。__init__myclassmyclassmyclassmyclass.getString()

相互にクラスを定義するのではなく、継承を使用する必要があるかもしれませんが、それは単なる推測です。

Pythonでクラスを使用する方法を理解するには、 Python チュートリアルを読む必要があります。

于 2012-07-22T19:38:17.757 に答える
1

あなたのコードは混乱しています。私が知る限り、あなたが望むものと同様のことを行うための2つの異なる方法があります.

class myclass:
    def __init__(self):
        pass

    def getString(self):
        return "something"

class child(myclass):
    def __init__(self):
        self.var = self.getString()

    def someMethod(self):
        return "hello"

...そしてその出力:

>>> c = child()
>>> print c.var
something

ここでは、親クラスを定義しmyclasschildinheritにしてmyclassいます。getString継承されているため、通常どおり呼び出すことができます。

クラスを非公開にする必要がある場合 (Python では一般的な慣用句ではありません)、次の方法があります。

class myclass2:
    def __init__(self):
        class temp(myclass2): # inherits myclass
            def __init__(self):
                self.var = self.getString()

        self.__privateClass = temp 

    def getString(self):
        return "something else"

    def test(self):
        temp = self.__privateClass()
        print temp.var

そして出力:

>>> m = myclass2()
>>> m.test()

...その方法は少しばかげていますが。

また、何かを子クラスとしてではなく、プライベートとしてマークするために二重アンダースコアが使用されていることにも注意してください。(「プライベート変数」の概念は、Python と他の言語では異なることに注意してください。 詳細情報)

于 2012-07-22T20:04:21.493 に答える