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

乌鸦座

是否可以定义将属性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)

有没有办法做到这一点?

阿巴内特

每当您需要无法轻易静态指定的默认值时,惯用法就是使用前哨值。

如果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)

或者,即使None可能是一个值,您也需要创建一个私人哨兵,任何人都不会通过:

_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收集所有未知关键字参数的参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python-类方法和<code> self </ code>中的默认值

self.included –包括来自Ruby中模块的类方法

关于self.kwargs来自何处的问题(如果未定义)?专门在Django代码库中的SingleObjectMixin类中

尝试使用 **kwargs 在类中定义属性

def __init __(self,* args,** kwargs)在python中初始化类

python3默认类属性为同一类中的方法

具有类继承的kwargs中的默认值

Python OOP:__init__中的所有self。“ something”属性是否可用于其他类方法?

在类中设置python方法的属性

Python中的静态类方法属性

如何从单独的类python中的方法操作类中的属性

**kwargs 属性在机器学习模型类中的含义

使用* args和** kwargs在Python中初始化类Object()的正确方法

类方法中定义的python函数可以访问self吗?

Self 不会传递给 Python 中的类方法

用python方式用** kwargs覆盖默认参数的方法?

来自ReactJS中属性的类字段

类方法中的默认参数不是唯一的python

重新应用类中的默认元素属性

python中的类默认参数

如何在 Python3 中的类中迭代 self 属性?

传递self.var(实例属性)作为默认方法参数

在没有 self 的情况下使用来自另一个类的 Python 方法

如何在python中从变量参数(kwargs)设置类属性

如何在python中从变量参数(kwargs)设置类属性

来自类外部的python调用方法

在类方法中包含来自main()的容器

我可以在Python的类方法中添加属性吗?

使用 Python 中的类方法检索类属性