Python:使类方法全局化

时间:2017-08-21 12:41:02

标签: python class module arguments python-import

有两个模块:my_modulemy_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_func2Class<?> clazz = grailsDomainClass.clazz ... def grailsDomainClass = new DefaultGrailsDomainClass(clazz) ... GrailsDomainClassProperty[] properties = grailsDomainClass.properties ... def propertyName = grailsDomainClass.propertyName ... def referenceType = grailsDomainClassProperty.referencedPropertyType ... 呢?我怎样才能制作实例,并且之前使用过它的方法?除了作为参数传递或在每个函数中创建另一个解决方案之外,还有其他解决方案吗

1 个答案:

答案 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的新模型,但说实话,我说它做起来并不是什么大不了的事重构。