【问题标题】:Import code directly into script with Python?使用 Python 将代码直接导入脚本?
【发布时间】:2010-11-27 22:30:33
【问题描述】:

我正在开发一个 PyQT4 应用程序,我很难同时浏览所有代码。我知道import foo 语句,但我不知道如何让它直接 将一大段代码导入到我的脚本中,例如BASH source foo 语句。

我正在尝试这样做:

# File 'functions.py'

class foo(asd.fgh):
  def __init__(self):
    print 'foo'

这是第二个文件。

# File 'main.py'

import functions

class foo(asd.fgh):
  def qwerty(self):
    print 'qwerty'

我想包含来自两个单独文件的代码或合并类减速。在 PHP 中,有import_once('foo.php'),正如我之前提到的,BASH 有source 'foo.sh',但我可以用 Python 来完成吗?

谢谢!

【问题讨论】:

    标签: python class import merge include


    【解决方案1】:

    出于某种原因,我首先想到的是多重继承。但是为什么不尝试正常的继承呢?

    class foo(functions.foo):
        # All of the methods that you want to add go here.
    

    有什么原因导致这行不通吗?


    既然你只想合并类定义,为什么不这样做:

    # main.py
    import functions
    
    # All of the old stuff that was in main.foo is now in this class
    class fooBase(asd.fgh):
        def qwerty(self):
            print 'qwerty'
    
    # Now create a class that has methods and attributes of both classes
    class foo(FooBase, functions.foo): # Methods from FooBase take precedence
        pass
    

    class foo(functions.foo, FooBase): # Methods from functions.foo take precedence      
        pass
    

    这利用了 python 的多重继承能力来创建一个包含来自两个来源的方法的新类。

    【讨论】:

    • 哇,这比我之前想象的要好得多!
    • @Blender,查看我的更新。为什么不直接使用普通继承?
    • 我已经扩展了一个类,QtGui.QMainWindow。有没有办法扩展多个类?
    【解决方案2】:

    你想要execfile()。虽然你真的不知道,自从重新定义一个类,呃……重新定义它。

    【讨论】:

    • +1 表示“你真的不知道”并且总是知道做一些愚蠢的事情的好方法。我的第一个想法是使用ast 模块,然后使用compileexec 来写execfile :|
    • @aaronsterling:这并不总是愚蠢,请注意。我已经成功地使用它来将 Django 设置模块拆分为(非包)文件夹中的多个文件。
    • 谢谢。我正在寻找合并类,但我也有这个功能的用途......
    【解决方案3】:

    python 中的猴子修补工作的方式几乎不同。这通常被认为是糟糕的形式,但如果你想这样做,你可以这样做:

    # File 'functions.py'
    
    class foo(asd.fgh):
      def __init__(self):
        print 'foo'
    

    导入的模块保持不变。在导入模块中,我们做的事情完全不同。

    # File 'main.py'
    
    import functions
    
    def qwerty(self):
      print 'qwerty'
    
    functions.foo.qwerty = qwerty
    

    请注意,没有额外的类定义,只是一个裸函数。然后我们将函数添加为类的属性。

    【讨论】:

    • 谢谢!我太习惯 PHP 的语法了……有没有我应该使用的首选替代方案?
    • @Blender。是的。多重继承。
    • 是的,MonkeyPatching / DuckPunching 被认为是不好的形式,但有时你真的需要这样做:比如当你有一个你无法控制的类时,以及提供的代码你只有那个类(并且不能给你一个子类),但是你需要在那个类中添加一个方法。 Ruby 能够“重新打开”类,包括系统类,确实很有帮助。 datetime.timedelta,我在看着你。说真的,你应该可以被浮点数整除... /rant
    猜你喜欢
    • 1970-01-01
    • 2021-08-30
    • 2020-12-27
    • 1970-01-01
    • 2020-05-07
    • 2017-11-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多