Python:默认使用私有静态方法

时间:2018-04-25 07:40:37

标签: python

我有一个接受函数的类成员:

class A:

    def func(self, method):
       ...

我想设置一个默认方法,因为99%的时间都需要这种行为。 此默认行为是静态的,因为它不依赖于类的任何成员。但是,我希望这个默认方法是私有的,对用户是不可见的。有什么方法可以实现吗?

这就是我的尝试:

  1. class A:
    
        @staticmethod
        def __meth(x):
           pass
    
        def func(self, method = meth):
           pass
    

    错误:'staticmethod' object is not callable

  2. class A:
    
        @staticmethod
        def __meth(x):
           pass
    
        def func(self, method = A.__meth):
           pass
    

    错误:NameError: name 'A' is not defined

  3. class A:
    
        @staticmethod
        def __meth(x):
           pass
    
        def func(self, method = self.__meth):
           pass
    

    错误:NameError: name 'self' is not defined

  4. 我使用的是Python 3.5,并且不想依赖更新的功能。

3 个答案:

答案 0 :(得分:3)

使用None作为默认值并根据需要分配它是相当惯用的:

class A:

    @staticmethod
    def __meth(x):
        print(x)

    def func(self, method=None):
        if method is None:
            method = self.__meth

        method("x")

答案 1 :(得分:2)

问题始于您的默认参数。在读取类定义时会评估这些参数,因此尚未定义类A

你应该像普通的默认参数一样处理它:

class A:

    @staticmethod
    def __meth(x):
       print('meth')

    def func(self, method = None):
        if method is None:
            self.__meth(1)
        else:
             method()


def foo():
    print('foo')

a = A()

a.func()
a.func(foo)

输出:

meth
foo

答案 2 :(得分:2)

您可以将名称解析延迟到lambda:

class A:

   @staticmethod
   def __meth(x):
       pass

   def func(self, method = lambda s: A.__meth(s)):
       pass