【问题标题】:How to use class property as a default parameter in Python?如何在 Python 中使用类属性作为默认参数?
【发布时间】:2020-10-27 18:01:27
【问题描述】:

我想使用类属性作为标准(当用户不提供任何数据时它有一个默认值)参数给相同的类方法。

class Class:

    def __init__(self):
        self.property = True

    def method(self, parameter = False):
        if not parameter:
            parameter = self.property
        return parameter

c = Class()
print(c.method())
print(c.method("False"))

>>>True
>>>False

上面的代码可以用,但是感觉很乱,有没有更聪明更简洁的方法呢?

【问题讨论】:

  • 这段代码有什么问题?你能提供更多细节吗?
  • @RiccardoBucco,它确实有效,但没有更简洁的方法来获得相同的结果吗?
  • 您希望每个实例都有自己的默认值吗?您可以使用类属性而不是实例属性。此外,None 将是比 0 更传统的哨兵。

标签: python class methods parameters properties


【解决方案1】:

我认为这是最简单的方法:

class Class:
    property = True
    def method(self, parameter = 0):
        if not parameter:
            parameter = Class().property
        return parameter
print(Class().method())
print(Class().method("False"))

【讨论】:

  • 大概,这个想法是有多个方法共享相同的默认值,否则是的,没有理由首先使用实例属性。
【解决方案2】:

我想不出比这更简洁的东西了:

class Class:
    def __init__(self):
        self.property = True
    def method(self, parameter=0):
        return self.property if not parameter else parameter

【讨论】:

    【解决方案3】:

    如果您真的在 __init__ 中硬编码默认值,最好 (ab) 使用类属性作为默认值。

    class Class:
        _param_default = True
    
        def method(self, parameter=_param_default):
            return parameter
    
        del _param_default  # Optional, but it's not really a class attribute
    

    如果这真的应该有一个特定于实例的默认值,那么你真的不能让它更短。该方法是在创建实例之前定义的,因此需要在运行时进行检查。

    class Class:
    
        _sentinel = object()
    
        def __init__(self):
            self.property = True
    
        def method(self, parameter=_sentinel):
            if parameter is _sentinel:
                parameter = self.property
            return parameter
    

    None 是更传统的哨兵,如果 None 不是 method 的有效参数,您可以使用它代替 _sentinel

    【讨论】:

    • 使用类属性而不是实例属性确实感觉更干净,谢谢。