2017-11-17 20 views
0

入力を受けずに値を返す関数を渡そうとしています。この関数はクラス内で定義されています。しかし、それは次のエラーを投げている:Pythonのオプションの引数に関数を渡します。

NameError: name 'self' is not defined 

以下のサンプルコードを参照してください:

class Test(): 
    def rand(self): 
     return 4 

    def print_rand(self, num=self.rand()): 
     print num 

t = Test() 
print t.print_rand() 

任意の回避策を、してください?私はUbuntu 14.04 LTS PCでPython 2.7を使用しています。

+0

あなたは 'self.rand()'を使用できません – alfasin

答えて

3

このようにすることはできません。

そして、それは良いことだ - デフォルトは機能の作成で評価されているため(すなわち、それを呼び出していない場合)。それがうまくいけば、プログラムが最初にこの関数を読み込んだときに乱数が生成され、その後、すべての呼び出しで同じ乱数が保持されます。

これは、あなたが望む効果を与えるはずです。

def print_rand(self, num=None): 
    if num is None: 
     num = self.rand() 
    # ... 
+0

ありがとうございました。 –

3

オプション引数としてselfを使用することはできませんが、静的プロパティを定義することはできません。

https://repl.it/@marksman/ravijoshi

class Test(object): 
    rand = 4 # statically defined 

    def print_rand(self, num=rand): 
     print(num) 

t = Test() 
t.print_rand() 
1

あなたはメソッドとしてnumを定義する必要がある場合numNoneの値を渡すことができない限り、何@Shadowが言ったことは、行くための最良の方法です。

もう一つのオプションは、単に自己を取らず、通常の関数としてあなたのパラメータで呼び出すだけの関数を定義することです。あなたが実際にインスタンス内では何もアクセスしないでいき、そしていくつかの一定の値を返すする場合

class Test(): 
    def rand(): 
     return 4 

    def print_rand(self, num=rand()): 
     print num 

t = Test() 
print t.print_rand() 

、あなたは@staticmethodとしてそれを定義することができます。

これはすべて、関数のパラメータ宣言内でデフォルト値を取得するメソッドを呼び出すためのユースケースが何であるかわかりません。 @ Shadowのポストのような明白な方が珍しいことを言ったほうがよい。それはあなたと他の誰かを将来的に楽しくするでしょう。

+0

これを行うと、Pythonが 'self'で渡そうとするため、インスタンスから' rand'を呼び出すことができなくなります。 – Shadow

関連する問題