加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python中的类方法:来自self属性的默认kwargs

发布时间:2020-12-20 11:05:34 所属栏目:Python 来源:网络整理
导读:是否可以定义一个类方法,该方法将self的属性作为默认关键字参数?即我想做一些与以下相同的事情: class Foo: def __init__(self,bar): self.bar = bar def do_a_thing(self,my_arg=self.bar): do_something_else(my_arg) 当然这会引发错误: x = Foo(y)x.do
是否可以定义一个类方法,该方法将self的属性作为默认关键字参数?即我想做一些与以下相同的事情:

class Foo:
    def __init__(self,bar):
        self.bar = bar

    def do_a_thing(self,my_arg=self.bar):
        do_something_else(my_arg)

当然这会引发错误:

x = Foo(y)
x.do_a_thing()

NameError: name 'self' is not defined

希望很清楚我希望得到什么样的行为.调用x.do_a_thing()应该等同于x.do_a_thing(my_arg = x.bar).

有没有办法做到这一点?

解决方法

无论何时你想要一个不能静态指定的默认值,这个习惯用法就是使用一个sentinel值.

如果None不是任何人可能传递的有效值,请使用:

def do_a_thing(self,my_arg=None):
    if my_arg is None:
        my_arg = self.bar
    do_something_else(my_arg)

或者,如果没有任何有效的假值:

def do_a_thing(self,my_arg=None):
    if not my_arg:
        my_arg = self.bar
    do_something_else(my_arg)

或者,如果Even甚至可以是一个值,你需要创建一个没人会传递的私人哨兵:

_sentinel = object()
def do_a_thing(self,my_arg=_sentinel):
    if my_arg is _sentinel:
        my_arg = self.bar
    do_something_else(my_arg)

顺便说一下,将其称为“默认关键字参数”意味着严重的误解.函数定义中的默认值的语法看起来类似于函数调用中关键字参数的语法这一事实是巧合.特别是,这不是关键字参数,可以在不使用关键字参数的情况下调用它.例如:

my_thing.do_a_thing(20)

如果你真的想要一个只有关键字的参数,它必须在*之后(或者在* args之后,如果你有其中一个).并且,因为这些是完全不相关的功能,您可以使用没有默认值的仅限关键字的参数:

def do_a_thing(self,*,my_arg):
    do_something_else(my_arg)

并且“kwargs”通常不用作“关键字参数”或“关键字参数”的简写,而是用于收集所有未知关键字参数的** kwargs参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读