在Python中使用类变量作为非默认参数
有没有办法在一个类里面保持一个私有的类变量,同时又能把它当作一个非默认变量的默认值使用(而不需要在类外部提前定义这个值)?
举个例子:
class a:
def __init__(self):
self.__variable = 6
def b(self, value = self.__variable):
print value
3 个回答
4
值得一提的是,如果你希望在允许的参数范围内包含None
,你可以创建一个自定义的哨兵值,这个值在你的代码中不会被用作其他目的。否则,value
和None
就无法从b
中返回。
UseDefault = object()
# Python 3? Otherwise, you should inherit from object unless you explicitly
# know otherwise.
class a:
def __init__(self):
self._variable = 6
def b(self, value=UseDefault):
if value is UseDefault:
value = self._variable
print value
现在可以将None
传递给b
,而不会导致使用默认值。
4
self.__variable
是一个实例变量,而不是类变量。- 因为默认参数是在定义方法的时候就被计算的,所以你不能直接把实例变量当作默认参数使用(不过有个常用的技巧,就是把默认值设为
None
,然后在方法体内加上if arg is None: arg = real_default
,这样是可以的)。 - 前面有两个下划线并不意味着“私有”,而是意味着“名字会被改变,可能会引发麻烦”。如果你不太明白我说的是什么意思,那就不要使用这个“特性”。它的本意并不是用来表示私有成员——如果想表示私有,应该用一个下划线。
14
你可能想得太复杂了:
class a:
def __init__(self):
self.__variable = 6
def b(self, value=None):
if value is None:
value = self.__variable
print value