2010-11-27 2 views
1

Я разрабатываю приложение PyQT4, и мне становится очень трудно перемещаться по всему коду сразу. Я знаю инструкцию import foo, но я не могу понять, как заставить импортировать кусок кода напрямую в мой скрипт, например инструкцию BASH source foo.Импортировать код непосредственно в скрипт с помощью Python?

Я пытаюсь сделать это:

# 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?

Спасибо!

ответ

4

По какой-то причине моя первая мысль была множественной наследованием. Но почему бы не попробовать обычное наследование?

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 

Это использует возможности питонов для множественного наследования, чтобы создать новый класс с методами из обоих источников.

3

Вы хотите execfile(). Хотя вы действительно этого не делаете, поскольку переопределяете класс, он ... переопределяет его.

+0

+1 для «вы действительно этого не делаете» и для того, чтобы всегда знать хороший, простой способ сделать что-то глупое. Моя первая мысль заключалась в том, чтобы использовать модуль `ast`, а затем использовать` compile` и `exec`, чтобы, по сути, написать` execfile`: | – aaronasterling 2010-11-27 22:37:52

+1

@aaronsterling: Это не всегда * глупо, заметьте. Я использовал его с большим успехом, чтобы разделить модуль настроек Django на несколько файлов в папке (не для пакетов). – 2010-11-27 22:41:18

+0

Спасибо. Я собирался объединить классы, но у меня тоже есть возможность использовать эту функцию ... – Blender 2010-11-27 23:17:48

0

Патч обезьяны в 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 

Обратите внимание, что нет дополнительного определения класса, только голой функции. мы добавляем функцию как атрибут класса.

Смежные вопросы