1

これが私のクラスバーです:

class Bar:
    def __init__(self, start, end, open, volume, high=open, low=open, last=open):
        self.start = start
        self.end = end
        self.open = open
        self.high = high
        self.low = low
        self.last = last
        self.volume = int(volume)

    def __str__(self):
        return self.start.strftime("%m/%d/%Y\t%H:%M:%S") + "\t" + self.end.strftime("%H:%M:%S") + "\t" +str(self.open) + "\t" + str(self.high) + "\t" + str(self.low) + "\t" + str(self.last) + "\t" + str(self.volume)

1)開いているものが何であれ、high、low、lastを初期化しようとしています。これはこれを行う正しい方法ですか?

2)print(str(bar))を実行すると、次のような面白い出力が得られます...

03/13/2012 12:30:00 13:30:00 138.91 <built-in function open> 138.7 <built-in function open> 13177656

4

5 に答える 5

5

関数を次のように記述した場合

def __init__(self, start, end, foo, volume, high=foo, low=foo, last=foo):
    self.start = start
    self.end = end
    self.open = foo
    self.high = high
    self.low = low
    self.last = last
    self.volume = int(volume)

foo名前が定義されていないことを示すNameErrorが発生します。これは、パラメーターのデフォルト値が、その値を取得しようとしたときにまだ定義されていない別のパラメーターを参照できないためです。(デフォルト値は、メソッドが呼び出されたときではなく、メソッドが定義されたときに設定されます。)

ただし、openこれはPythonの組み込み関数であるため、定義されています。それはopenあなたが意図したものではありませんでした。これを行う正しい方法はおそらく

class Bar:
    def __init__(self, start, end, open, volume, high=None, low=None, last=None):
        self.start = start
        self.end = end
        self.open = open
        self.high = open if high is None else high
        self.low = open if low is None else low
        self.last = open if last is None else last
        self.volume = int(volume)

さらに、組み込み関数の混乱(および一時的なシャドウイング)を避けるために、パラメーター名として「open」の代わりに「open_」を使用することもできます。

于 2012-08-03T13:03:22.387 に答える
3

あなたは、そうです、それopenはファイルを開くための組み込みのPython関数です。つまり、変数にメソッドを割り当てています。

于 2012-08-03T12:58:55.277 に答える
2

これは機能しません。

デフォルトの引数は、関数が解析されているときに1回だけ評価されます。これは、値が必要であることを意味します。メソッドシグネチャの他の仮パラメータには値がありません。それらはプレースホルダーのようなものです。そのため、やりたいことをするのは不可能です。

Pythonは、と呼ばれる既存の識別子を検索し、その時点で表現されていたオブジェクトを変数に割り当て、関数が実行されるときopenに常に割り当てます。highlow

于 2012-08-03T13:03:02.083 に答える
2

私はあなたがそれをすることができないと思います。「open」を使用すると、組み込み関数open()が考慮されるため、この出力が得られます。openを呼び出す代わりに別の名前を使用すると、エラーが発生します。

低、高、最後をなしにすることができない場合は、次のことができます。

class Bar:
def __init__(self, start, end, open, volume, high=None, low=None, last=None):
    self.start = start
    self.end = end
    self.open = open
    self.high = high if high is not None else open
    self.low = low if low is not None else open
    self.last = last if last is not None else open
    self.volume = int(volume)
于 2012-08-03T13:04:27.243 に答える
1

の:

def __init__(self, start, end, open, volume, high=open, low=open, last=open)

open組み込みopenメソッドを参照しています。メソッドをパラメーターとして渡すことは、次のような状況で非常に役立ちますmax(sequence, key=itemgetter(2))。呼び出し可能オブジェクトが期待される場合。

に渡される値をデフォルトhighの、lowにしたいと思います。その場合は、キーワード引数を使用します。lastopen__init__

def __init__(self, start, end, open, volume, **kwargs):
    for k in ('high', 'low', 'last'):
        setattr(self, k, kwargs.get(k, open))

または:

def __init__(self, start, end, open, volume, high=None, low=None, last=None):
    if high is None:
        self.high = open
    # etc...

私もopen名前としては使いません...

于 2012-08-03T13:06:57.770 に答える