我有一个有很多方法的课。如何修改我的方法,以便它们也可以作为函数直接访问而无需创建该类的对象?是否可能。
答案 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"