Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用类属性作为Python中的默认参数?_Python_Class_Methods_Parameters_Properties - Fatal编程技术网

如何使用类属性作为Python中的默认参数?

如何使用类属性作为Python中的默认参数?,python,class,methods,parameters,properties,Python,Class,Methods,Parameters,Properties,我想使用类属性作为同一类方法的标准参数(当用户不提供任何数据时,它就有一个默认值) class Class: def __init__(self): self.property = True def method(self, parameter = False): if not parameter: parameter = self.property return parameter c = Class

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

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

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

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

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

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

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

如果您真的在
\uuuu init\uuuu
中硬编码默认值,那么最好(ab)使用class属性作为默认值

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
是更传统的sentinel,如果
None
不是
方法的有效参数,您可以使用它来代替
\u sentinel
,这段代码有什么问题?你能提供更多的细节吗?@RiccardoBucco,它确实有效,但是没有更简洁的方法来获得相同的结果吗?你希望每个实例都有自己的默认值吗?可以使用类属性而不是实例属性。另外,
None
将是一个比0更为传统的哨兵。大概的想法是,有多个方法将共享相同的默认值,否则是的,没有理由首先使用实例属性。使用类属性而不是实例属性会感觉更干净,谢谢。