4
class makeCode:
    def __init__(self,code):
            self.codeSegment = code.upper()
            if checkSegment(self.codeSegment):
                    quit()
            self.info=checkXNA(self.codeSegment)
    def echo(self,start=0,stop=len(self.codeSegment),search=None): #--> self not defined
            pass

動作していません...

  • 変数selfは実際には定義されていませんでした。
  • checkSegment入力がヌクレオチド文字で構成された文字列でない場合、または一緒にできないヌクレオチドが含まれている場合、関数は 1 を返します。
  • それが発生した場合は終了します。問題ありません。完全に機能します。
  • checkXNA次に、「dnaSegment」または「rnaSegment」という情報を含む文字列を返す関数をチェックして、情報 (RNA または DNA の場合) を割り当てます。完璧に動作します。

しかし、echoより具体的な情報を出力するために設計される関数は、自己が定義されていないことを教えてくれますが、なぜですか?

4

2 に答える 2

6

デフォルトのパラメータ値は、関数またはメソッドの定義が評価されるとき、つまりクラスが解析されるときに評価されます。

オブジェクトの状態に依存するデフォルトのパラメーター値を記述する方法はNone、番兵として使用することです。

def echo(self,start=0,stop=None,search=None):
    if stop is None:
        stop = len(self.codeSegment)
    pass
于 2012-11-07T15:29:33.430 に答える
6

selfは関数定義時に定義されていないため、これを使用してデフォルト引数を作成することはできません。

関数定義の式は、関数が呼び出されたときではなく、関数が作成されたときに評価されます。「最小の驚き」と可変デフォルト引数を参照してください。

代わりに次の手法を使用してください。

def echo(self, start=0, stop=None, search=None):
    if stop is None:
        stop = len(self.codeSegment)

Noneの可能な値としてサポートする必要がある場合stop(たとえば、明示的に指定された場合Noneに有効な値でstopある場合)、使用する別の一意のセンチネルを選択する必要があります。

_sentinel = object()

class makeCode:
    def echo(self, start=0, stop=_sentinel, search=None):
        if stop is _sentinel:
            stop = len(self.codeSegment)
于 2012-11-07T15:28:04.937 に答える