有两个模块:my_module
和my_func
。还有一个从my_module
导入的函数#main.py
from my_module import my_func
def main_func1():
#do smth
my_func()
#do smth
def main_func2():
#do smth
my_func()
#do smth
def main():
#do smth
main_func1()
my_func()
main_func2()
#do smth
,用于整个主模块,如
my_module
当我在my_func
中重写代码时,问题就出现了,现在my_func
是一个类的方法。
如果main()
仅在from my_module import myClass
def main():
c = myClass(init_parameters)
#do smth
main_func1()
c.my_func()
main_func2()
#do smth
中,则可以轻松更改主模块
main_func1
但是main_func2
和Class<?> clazz = grailsDomainClass.clazz
...
def grailsDomainClass = new DefaultGrailsDomainClass(clazz)
...
GrailsDomainClassProperty[] properties = grailsDomainClass.properties
...
def propertyName = grailsDomainClass.propertyName
...
def referenceType = grailsDomainClassProperty.referencedPropertyType
...
呢?我怎样才能制作实例,并且之前使用过它的方法?除了作为参数传递或在每个函数中创建另一个解决方案之外,还有其他解决方案吗
答案 0 :(得分:1)
正如评论所说,如果你期望my_func
表现得像一个全局函数,但作为一个类中的方法,它应该是一个静态方法或类方法。这是一个例子 - 这是foo.py
:
class Foo:
@staticmethod
def say_hello():
print("hello")
现在在main.py
你可以做到:
from foo import Foo
say_hello = Foo.say_hello
def func1():
say_hello()
def main():
say_hello()
func1()
if __name__ == "__main__":
main()
这成功输出
hello
hello
我在say_hello
中使main.py
看起来像一个全局函数的方式就是在全局范围内将Foo.say_hello
分配给say_hello
。这完全是可能的,因为函数是Python中的第一类对象。
来自foo import Foo
考虑它必须是实例方法:
class Foo:
def __init__(self, msg):
self.msg = msg
def say(self):
print(self.msg)
foo模型不得不改变一下。请记住,它应该只是一个实例方法,如果您希望它在调用它的实例上表现不同,那么在这种情况下,say
必须是实例方法,因为它依赖于msg
值它的实例。
from foo import Foo
def func1():
say()
def main():
global say
f = Foo("hello")
say = f.say
say()
func1()
if __name__ == "__main__":
main()
这仍然有效,但老实说,它现在已经变得松散的编码风格。如果您的函数需要访问特定实例的方法,则应该将实例传递给它们。使用global
关键字通常会略显模糊,当我将其用作实例方法时,我会说这是真的。“
from foo import Foo
def func1(f):
f.say()
def main():
f = Foo("hello")
f.say()
func1(f)
if __name__ == "__main__":
main()
也工作正常。您似乎有点担心必须更改您的代码以使用my_func
的新模型,但说实话,我说它做起来并不是什么大不了的事重构。