在Python中使用类变量作为非默认参数

8 投票
3 回答
2442 浏览
提问于 2025-04-16 09:39

有没有办法在一个类里面保持一个私有的类变量,同时又能把它当作一个非默认变量的默认值使用(而不需要在类外部提前定义这个值)?

举个例子:

class a:
    def __init__(self):
        self.__variable = 6
    def b(self, value = self.__variable):
        print value

3 个回答

4

值得一提的是,如果你希望在允许的参数范围内包含None,你可以创建一个自定义的哨兵值,这个值在你的代码中不会被用作其他目的。否则,valueNone就无法从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
  1. self.__variable 是一个实例变量,而不是类变量。
  2. 因为默认参数是在定义方法的时候就被计算的,所以你不能直接把实例变量当作默认参数使用(不过有个常用的技巧,就是把默认值设为 None,然后在方法体内加上 if arg is None: arg = real_default,这样是可以的)。
  3. 前面有两个下划线并不意味着“私有”,而是意味着“名字会被改变,可能会引发麻烦”。如果你不太明白我说的是什么意思,那就不要使用这个“特性”。它的本意并不是用来表示私有成员——如果想表示私有,应该用一个下划线。
14

你可能想得太复杂了:

class a:

    def __init__(self):
        self.__variable = 6

    def b(self, value=None):
        if value is None:
            value = self.__variable
        print value

撰写回答