Вы должны использовать себя. префикс, если вы вызываете метод, который является частью класса. Если вместо этого вы хотите вызывать main () глобально и размещать его вне класса, вы не должны определять функции main () и gen () в классе, который он сам. поэтому, когда вы вызываете gen () и gen () не является глобальной функцией, но это функция, которая находится в классе, вы должны ввести
generate = self.gen(size)
Помните, что отступы в python - это способ иметь блоки. Так что, если вы сделаете отступ main, main будет в блоке класса, и он не будет доступен глобально.
По-моему, лучшее решение имело бы следующие характеристики:
Использует доступные услуги кэширования, предоставленные старающимся избегать платформы, пишущий Ваше собственное.
Не связывает Вашу библиотеку классов с Системой. Сеть, чтобы иметь когерентные слои.
Но если библиотека классов работает в приложении ASP.NET, решение не должно требовать для навлечения другой реализации кэширования (например, Блок Программы кэширования Библиотеки Предприятия), который требует дополнительной конфигурации и установки.
Так, я использовал бы стратегию МОК, чтобы позволить библиотеке классов использовать различные реализации кэширования, на основе среды, на которой она работает.
Предположим, что Вы определяете свой абстрактный контракт на кэширование как:
public interface ICacheService
{
AddItem(...);
}
Вы могли обеспечить реализацию на основе Системы. Сеть:
public AspNetBasedCacheService : ICacheService
{
AddItem(...)
{
// Implementation that uses the HttpContext.Cache object
}
}
И затем 'опубликуйте' ту реализацию как одиночный элемент. Обратите внимание, что различие с Вашим исходным подходом - то, что одиночный элемент является просто ссылкой на кэш ASP.NET основанная на сервисе реализация вместо полного 'объекта кэша'.
public class ChacheServiceProvider
{
public static IChacheService Instance {get; set;}
}
Необходимо было бы инициализировать chaching реализацию или путем выполнения ленивой инициализации, или при запуске приложения (в global.asax.cs)
И каждый доменный компонент смог бы использовать опубликованный сервис кэширования, не зная, что он реализован на основе Системы. Сеть.
// inside your class library:
IChacheService chache = CacheServiceProvider.Instance;
cache.AddItem(...);
Я соглашаюсь, что это - вероятно, не простое решение, но я стремлюсь к использованию в своих интересах реализации кэша ASP.NET, не жертвуя отделением кода и гибкостью.
Я надеюсь, что понял Ваше право вопроса.
Данные не собрать "мусор", пока кэш все еще содержит ссылку на них.
Кроме того, никогда не используйте Одиночные элементы.