Модули могут иметь свойства тот же способ, которым могут объекты?

Автогенерация подходит для простых запросов: в этом случае, вероятно, проще просто определить запрос вручную, тогда вам нужно только 2 параметра.

public interface OrderRepository
    extends PagingAndSortingRepository<Order, String>, QuerydslPredicateExecutor<Order> {

  @Query("select o from Order o where (o.startDate between ?1 and ?2) " + 
            "or (o.updatedDate between ?1 and ?2)")
  public Page<Order> findByCreatedOrUpdatedBetween(Date startDate, Date endDate,
      Pageable pageRequest);
}
87
задан martineau 30 September 2016 в 03:44
поделиться

3 ответа

На основе ответ John Lin :

def module_property(func):
    """Decorator to turn module functions into properties.
    Function names must be prefixed with an underscore."""
    module = sys.modules[func.__module__]

    def base_getattr(name):
        raise AttributeError(
            f"module '{module.__name__}' has no attribute '{name}'")

    old_getattr = getattr(module, '__getattr__', base_getattr)

    def new_getattr(name):
        if f'_{name}' == func.__name__:
            return func()
        else:
            return old_getattr(name)

    module.__getattr__ = new_getattr
    return func

Использование (отмечают начальный символ подчеркивания), в the_module.py:

@module_property
def _thing():
    return 'hello'

Тогда:

import the_module

print(the_module.thing)  # prints 'hello'

начальный символ подчеркивания необходим для дифференциации функции свойства-ized от исходной функции. Я не мог думать о способе повторно присвоить идентификатор, с тех пор во время казни декоратора, он еще не был присвоен.

Примечание, что IDE не будут знать, что свойство существует и покажет красный wavies.

1
ответ дан 24 November 2019 в 07:51
поделиться

Только экземпляры классов нового стиля могут иметь свойства. Вы можете заставить Python поверить, что такой экземпляр является модулем, спрятав его в sys.modules [thename] = theinstance . Так, например, ваш файл модуля m.py может быть:

import sys

class _M(object):
    def __init__(self):
        self.c = 0
    def afunction(self):
        self.c += 1
        return self.c
    y = property(afunction)

sys.modules[__name__] = _M()
55
ответ дан 24 November 2019 в 07:51
поделиться

Я бы сделал это, чтобы правильно наследовать все атрибуты модуля и правильно идентифицировать isinstance ()

import types

class MyModule(types.ModuleType):
    @property
    def y(self):
        return 5


>>> a=MyModule("test")
>>> a
<module 'test' (built-in)>
>>> a.y
5

А затем вы можете вставить это в sys.modules:

sys.modules[__name__] = MyModule(__name__)  # remember to instantiate the class
51
ответ дан 24 November 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: