使用类方法作为简单函数

时间:2012-03-27 15:48:15

标签: python

我有一个有很多方法的课。如何修改我的方法,以便它们也可以作为函数直接访问而无需创建该类的对象?是否可能。

3 个答案:

答案 0 :(得分:6)

这些方法将是“未绑定的”(实质上意味着它们没有self可以使用)。如果这些函数不能在self上运行,你可以将它们转换为静态方法(不带self第一个参数),然后将它们分配给变量以便像函数一样使用。

像这样:

class MyClass(object):
    @staticmethod
    def myfunc():
        return "It works!"

myfunc = MyClass.myfunc

myfunc() # prints "It works!"

基本上,你需要问自己“我的方法需要哪些数据(呃)功能?”根据您的回答,您可以使用@staticmethod@classmethod,或者您可能发现您确实需要self,在这种情况下,您需要先创建一个对象,然后再尝试使用它方法

最后的案例看起来像是:

myobj = MyClass()
del MyClass # This is a singleton class
myfunc = myobj.myfunc

除此之外,如果你发现你的所有方法都是静态方法,那么将它们从类中重构为普通函数是更好的风格,它们实际上已经存在。您可能已经从Java中学习了这种“类作为命名空间”的样式,但这在Python中是不正确的。 Python名称空间由modules表示。

答案 1 :(得分:1)

未约束的方法

要创建一个未绑定的方法(即,它的第一个变量是'self),您可以使用@staticmethod内置装饰器修饰该方法。如果装饰者或其中任何装饰者没有意义,请将Wiki,此simple explanation,装饰者检查为syntactic sugar并学习how to write a good one

>>> class foo(object):
...     @staticmethod
...     def bar(blah_text):
...         print "Unbound method `bar` of Class `foo`"
...         return blah_text 
...     
>>> foobar = foo.bar
>>> foobar("We are the Knights who say 'Ni'!")
Unbound method `bar` of Class `foo`
"We are the Knights who say 'Ni'!" 

绑定方法

这些方法在技术上并非“绑定”,但在调用时意味着绑定。你只需要指向它们和“Wala”的引用,你现在可以引用该方法。现在您只需要传递该类的有效实例:

>>> class foo:
...     def __init__(self, bar_value = 'bar'):
 ...         self.bar_value = bar_value
...     def bar(self, blah_text):    
...         return self.bar_value + blah_text
...         
>>> bar = foo.bar
>>> bar(foo('We are the Knights who say '), "'Ni'")
"We are the Knights who say 'Ni'"   

编辑:正如评论中指出的那样,似乎我对'绑定'的使用是错误的。知道它的人可以编辑/更正我的帖子吗?

答案 2 :(得分:-1)

如果您不想丢失self,可以使用类名作为参数调用该函数:

class something:
    def test(self):
        print('Hello')

something.test(something)
#prints "Hello"