' lib/
родительский каталог должен быть в sys.path
.
Ваш' lib/__init__.py
' мог бы быть похожим на это:
from . import settings # or just 'import settings' on old Python versions
class Helper(object):
pass
Тогда следующий пример должен работать:
from lib.settings import Values
from lib import Helper
__init__.py
определяет, как Ваш пакет смотрит снаружи. Если необходимо использовать Helper
в [1 110], тогда определяют Helper
в другом файле, например, 'lib/helper.py
'.
. | `-- import_submodule.py `-- lib |-- __init__.py |-- foo | |-- __init__.py | `-- someobject.py |-- helper.py `-- settings.py 2 directories, 6 files
команда:
$ python import_submodule.py
Вывод:
settings
helper
Helper in lib.settings
someobject
Helper in lib.foo.someobject
# ./import_submodule.py
import fnmatch, os
from lib.settings import Values
from lib import Helper
print
for root, dirs, files in os.walk('.'):
for f in fnmatch.filter(files, '*.py'):
print "# %s/%s" % (os.path.basename(root), f)
print open(os.path.join(root, f)).read()
print
# lib/helper.py
print 'helper'
class Helper(object):
def __init__(self, module_name):
print "Helper in", module_name
# lib/settings.py
print "settings"
import helper
class Values(object):
pass
helper.Helper(__name__)
# lib/__init__.py
#from __future__ import absolute_import
import settings, foo.someobject, helper
Helper = helper.Helper
# foo/someobject.py
print "someobject"
from .. import helper
helper.Helper(__name__)
# foo/__init__.py
import someobject
Я пробовал перегрузить оператор, и он, похоже, не работает для указателей,
Верно.
но работает для самих объектов.
Верно.
Так что же такое вопрос?
Вы хотите использовать указатели в отсортированном контейнере?
С:
#include <iostream>
#include <set>
struct X
{
int x;
};
C ++ 11 и выше
int main()
{
X x1; x1.x = 5;
X x2; x2.x = 6;
auto compare = [](auto const& lhs, auto const& rhs){return lhs->x < rhs->x;};
std::set<X*, decltype(compare)> plop(compare);
plop.insert(&x1);
plop.insert(&x2);
}
В C ++ 03
struct XPTest
{
bool operator()(X* const& lhs,X* const& rhs)
{
return lhs->x < rhs->x;
}
};
int main()
{
X x1; x1.x = 5;
X x2; x2.x = 6;
std::set<X*,XPTest> plop;
plop.insert(&x1);
plop.insert(&x2);
}
if(*obj1 < *obj2) { /* this should use the overloaded operator. */ }
Указатель является собственным типом C ++, и вы можете перегружать операторы только для определенных пользователем типов (т.е. классов).
Если бы это было возможно, это нарушило бы принцип «наименьшего удивления» и заставляют сравнения указателей вести себя по-разному в зависимости от того, было ли ваше определение видимым. Это, вероятно, очень сбивает с толку.
Если вы хотите использовать альтернативное сравнение для использования в контейнере или с алгоритмами, обратите внимание, что вы можете предоставить замену для std :: less
по умолчанию в большинстве ассоциативных контейнеров и алгоритмы, требующие частичного порядка.