Форум сайта python.su
0
Можете объяснить назначение статических методов и свойств класса?
Офлайн
12
ilnaz
рекомендую
в свое время зачитывался
вкратце если у Вас есть понимание чем отличается класс от объекта, то должно быть и понимание что такое свойства или методы принадлежащие именно классу, то есть статические
как пример: реализация синглтона
Офлайн
49
izekia
А чему тогда принадлежат классметоды? 
Офлайн
12
4kpt_IVэто конструкторы, не надо тут)
izekiaА чему тогда принадлежат классметоды?
Отредактировано izekia (Ноя. 15, 2016 00:33:06)
Офлайн
49
Конструкторы чего?
Офлайн
12
4kpt_IVклассметодом декорируются методы, которые как правило используются для альтернативного способа создания объекта данного класса, или я неправ?
Конструкторы чего?
Офлайн
49
Нет. Не только. Ну и называть это конструкторами все же не корректно…
Офлайн
12
4kpt_IVя понимаю, что не совсем корректно, но я встречал их в основном в виде “перегруженных конструкторов”
Нет. Не только. Ну и называть это конструкторами все же не корректно…
Офлайн
49
Подсчет количества экземпляров класса. Это навскидку. Могу еще привести множество примеров из алхимии. Там вообще другое использование.
Офлайн
568
izekiaКод из пакета setuptools
Кста, приведи пример другого использования, просто даже интересно.
class PackageFinder(object): @classmethod def find(cls, where='.', exclude=(), include=('*',)): """Return a list all Python packages found within directory 'where' 'where' should be supplied as a "cross-platform" (i.e. URL-style) path; it will be converted to the appropriate local path syntax. 'exclude' is a sequence of package names to exclude; '*' can be used as a wildcard in the names, such that 'foo.*' will exclude all subpackages of 'foo' (but not 'foo' itself). 'include' is a sequence of package names to include. If it's specified, only the named packages will be included. If it's not specified, all found packages will be included. 'include' can contain shell style wildcard patterns just like 'exclude'. The list of included packages is built up first and then any explicitly excluded packages are removed from it. """ out = cls._find_packages_iter(convert_path(where)) out = cls.require_parents(out) includes = cls._build_filter(*include) excludes = cls._build_filter('ez_setup', '*__pycache__', *exclude) out = filter(includes, out) out = filterfalse(excludes, out) return list(out) @staticmethod def require_parents(packages): """ Exclude any apparent package that apparently doesn't include its parent. For example, exclude 'foo.bar' if 'foo' is not present. """ found = [] for pkg in packages: base, sep, child = pkg.rpartition('.') if base and base not in found: continue found.append(pkg) yield pkg @staticmethod def _candidate_dirs(base_path): """ Return all dirs in base_path that might be packages. """ has_dot = lambda name: '.' in name for root, dirs, files in os.walk(base_path, followlinks=True): # Exclude directories that contain a period, as they cannot be # packages. Mutate the list to avoid traversal. dirs[:] = filterfalse(has_dot, dirs) for dir in dirs: yield os.path.relpath(os.path.join(root, dir), base_path) @classmethod def _find_packages_iter(cls, base_path): candidates = cls._candidate_dirs(base_path) return ( path.replace(os.path.sep, '.') for path in candidates if cls._looks_like_package(os.path.join(base_path, path)) ) @staticmethod def _looks_like_package(path): return os.path.isfile(os.path.join(path, '__init__.py')) @staticmethod def _build_filter(*patterns): """ Given a list of patterns, return a callable that will be true only if the input matches one of the patterns. """ return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns)
Офлайн