【问题标题】:Function in a python class that is not a method不是方法的python类中的函数
【发布时间】:2013-09-16 04:36:57
【问题描述】:

我有一个需要辅助功能的类,例如一个计算校验和,它只使用传入的参数而不是类的任何属性。此函数仅由类的方法调用。所以我不需要传入'self'作为函数的第一个形式。

我应该如何实现这些功能?我可以在一个类中使用非方法函数吗?我应该在课堂之外定义它们吗(即使它们没有被其他任何东西使用)?或者它们可以成为常规方法吗?

【问题讨论】:

  • 添加 self 参数而根本不使用它有什么不好?你为什么讨厌自己?
  • @yuvi :-) 是的,很公平,我只是虽然这可能是不好的做法或其他什么

标签: python-2.7


【解决方案1】:

如果您想要一个不将 self 作为参数的类中的函数,请使用 @staticmethod 装饰器:

 class Awesomeness(object):
     def method(self, *args):
         pass

     @staticmethod
     def another_method(*args):
         pass

但是,从概念的角度来看,我肯定会考虑将它放在模块范围内,特别是如果它是一个不使用实例或类属性的校验和函数。

【讨论】:

  • @spiderplant0: Module scope本质上是另一种表达global的方式。这是您自己提出的选项之一,即在“类外”定义函数。
【解决方案2】:

只做一个嵌套函数:

class Foo(object):
    def bar(self, arg):
        def inner(arg):
            print 'Yo Adrian imma in inner with {}!'.format(arg)

        inner(arg)    

Foo().bar('argument')      

或者直接忽略self:

class Foo(object):

    def prive(_, arg):
        print 'In prive with {}!'.format(arg)


    def bar(self, arg):
        def inner(arg):
            print 'Yo Adrian imma in inner with {}!'.format(arg)

        inner(arg)   
        self.prive(arg)

    def foo(self,arg):
        self.prive(arg)     

Foo().bar('argument')
Foo().foo('another argument') 

第二个示例打印:

Yo Adrian imma in inner with argument!   
In prive with argument!
In prive with another argument!

【讨论】:

  • 不幸的是,提问者暗示它被多种方法使用。
  • 想在类中定义回调函数,这个解决方案对我有用。
猜你喜欢
  • 2012-03-24
  • 2013-01-19
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
相关资源
最近更新 更多