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)我正在尝试初始化高、低和最后的开盘价。这是正确的方法吗?

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)

你会得到一个 NameError 抱怨名称foo没有定义。这是因为参数的默认值不能引用另一个参数,当您尝试获取其值时,该参数尚未定义。(默认值是在定义方法时设置的,而不是在调用它时设置的。)

但是,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

这行不通。

解析函数时,默认参数只计算一次。这意味着它必须有一个值:方法签名中的其他形式参数没有值。它们更像是占位符。因此,不可能做你想做的事。

Python 将搜索一个名为 的预先存在的标识符open,始终将它当时表示的那个对象分配给您的变量high以及low函数何时执行。

于 2012-08-03T13:03:02.083 回答
2

我不认为你能做到这一点。您有该输出,因为“打开”考虑了内置函数 open()。如果不调用 open 而是使用另一个名称,则会出现错误。

如果 low, high 和 last 不能是 None 你可以这样做:

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,作为传递给last的值,在这种情况下,我将使用关键字参数。open__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 回答