【问题标题】:Not Possible to Reference self in a Method Declaration?无法在方法声明中引用 self?
【发布时间】:2010-04-05 17:59:25
【问题描述】:

我想编写一个方法,其参数默认为成员变量,如下所示:

def method(self, arg1=0, arg2=self.member):

显然这是不允许的。我应该以不同的方式编写它,还是使用arg2 的值来指示何时使用成员变量?

【问题讨论】:

    标签: python argument-passing


    【解决方案1】:

    是的,使用哨兵——例如:

    class Foo(object):
        _sentinel = object()
        def method(self, arg1=0, arg2=_sentinel):
            if arg2 is self._sentinel: arg2 = self.member
            ...
        ...
    

    请注意,您需要在 def 中使用裸名 _sentinel,但在方法主体中需要 self._sentinel(因为这是在类主体与方法主体中的作用域;-)。

    【讨论】:

    • +1:很好的答案,尤其是关于方法定义中的_sentiel 与方法主体中的self._sentiel 的想法。
    【解决方案2】:
    def method(self, arg1=0, arg2=None):
        if arg2 is None:
            arg2 = self.member
        ...
    

    【讨论】:

    • 这会阻止调用者显式传入None,这在某些情况下可能是可以的,但在其他情况下则不行。我在 A 中建议的哨兵习语稍微“重”(课堂范围内的另一个陈述)但更笼统。
    • +1:实际上将None 视为合法值是非常非常罕见的;不得不说foo( bar=None )往往会出乎意料;为什么要提到bar?这更简单,并且涵盖了超过 99.7% 的实际案例。
    • @Alex,因为这可能是 python 初学者的问题,我提供了最简单的解决方案。在某种程度上,None 也是哨兵 :)
    • @S.Lott,有很多反例可以证明您声称“通过 None 违反了一个人的期望”:例如,在 somedict.pop 中,您必须明确指定 None 作为默认值,如果这是你想要什么,否则当他们的钥匙丢失时你会得到一个例外。
    • 我无法在 Alex Martelli 的和这个之间做出决定,但这个答案让我的课程更简单一些,所以我会继续下去。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    相关资源
    最近更新 更多