2016-12-27 6 views
-1

initで関数/メソッドを初期化しようとしています。 クラスAのself.yが正しい値10を返します。あるいは、Aのget_yメソッドを使用しますか?クラス構造内の変数の初期化

以下のコードとコメントを参考にしてください。示すように、おかげ

class A(object): 
    def __init__(self): 
     self.x = 5 
     self.y = None 
     # self.y = B.eval(self)?? # wants y to be a value obtained from B.eval() 
    def get_x(self): 
     return self.x 

    def get_y(self): 
     # wants y to be a value obtained from B.eval() 
     #return B.eval(self) ?? 

class B(object): 
    def eval(ClassA): 
     """ 
     :param ClassA: is an instance of A 
     :return: value 
     """ 
     return ClassA.get_x() + 5 


a = A() 
b = B() 
print(a.get_y()) # wants value 10 printed out here 
print(B.eval(a)) 
+1

それはあなたが求めているものは不明です。何を知りたいですか? – UnholySheep

+1

あなたは 'property'の使用を調べたいかもしれません。-aプロパティは、ユーザ定義コードを設定、取得、または削除する際に自動的に実行される属性です:https://docs.python.org/2/library/functions。 html#property – jez

+2

あなたは達成しようとしているもののあまり抽象的な例を教えてください。 'B 'を持っている点は何ですか? – jonrsharpe

答えて

0

ちょうどclass Bのメソッドデコレータとしてそれを使用してB.eval()classmethodします

class A(object): 
    def __init__(self): 
     self.x = 5 
     self.y = None 
     self.y = B.eval(self) 
    def get_x(self): 
     return self.x 

    def get_y(self): 
     return B.eval(self) 

class B(object): 
    @staticmethod # ADD THIS LINE 
    def eval(ClassA): 
     """ 
     :param ClassA: is an instance of A 
     :return: value 
     """ 
     return ClassA.get_x() + 5 

a = A() 
b = B() 
print(a.get_y()) # -> 10 
print(B.eval(a)) # -> 10 
+0

答えをありがとう。 –

+0

ようこそ。これは、 'eval()'に 'self'引数がなく、インスタンスを作成せずにそれを呼び出すために必要でした:' B.eval(a) '。クラスBの定義を自立型関数(同じ名前の組み込み関数を無効にすることを避けるために 'eval'とは異なる名前)にするのではなく、その定義を入れることで得られることはほとんどないことに注意してください。 – martineau

関連する問題