Найти - Пользователи
Полная версия: Как сделать так, чтоб в конце завершения класса выполнился еще кусок кода?
Начало » Python для новичков » Как сделать так, чтоб в конце завершения класса выполнился еще кусок кода?
1 2 3
py.user.next
FishHook
А если insert, это append в цикле?
Тогда при удалении append() надо будет удалять insert(). А если они не связаны, то не надо. Нельзя связывать код, надо развязывать код.
FishHook
py.user.next
А если они не связаны, то не надо. Нельзя связывать код, надо развязывать код.
То есть предлагаете повторять код внутри класса? Покажите мастер класс, как будете развязывать?

class Storage:
    """
       Library class with only one method "append(obj)"
    """
    def append(self, obj):
        pass
class MyList(object):
    def __init__(self):
        self.storage = Storage()
        self.len = 0
        self.first = None
        self.last = None
    def append(self, obj):
        self.storage.append(obj)
        if self.len == 0:
            self.first = obj
        self.len += 1
        self.last = obj
    def insert(self, lst):
        for l in lst:
            self.append(l)
py.user.next
FishHook
Покажите мастер класс, как будете развязывать?
Ну, допустим, в lst миллион элементов. Зачем миллион раз обновлять self.last?
И зачем такой ограниченный insert()? Почему бы не сделать у него позицию вставки?
FishHook
py.user.next
Ну, допустим, в lst миллион элементов. Зачем миллион раз обновлять self.last?
И зачем такой ограниченный insert()? Почему бы не сделать у него позицию вставки?
Низачем. Это искусственный пример. Он лишь демонстрирует маразматичность ваших заявлений.
py.user.next
FishHook
Он лишь демонстрирует маразматичность ваших заявлений.
Этот пример демонстрирует твою некомпетентность(не знаешь) и отсутствие опыта (очевидно же, что это выпадет потом).

Ты связал методы append() и insert() между собой и из-за этого ты теперь не сможешь их расширять (или исправлять в них баги). Потому что любое расширение одного метода будет ломать все методы, которые на нём основываются.
FishHook
py.user.next
Ранахера тоже в нубы записывай.

class Flask(_PackageBoundObject):
    app_ctx_globals_class = _AppCtxGlobals
    def _get_request_globals_class(self):
        return self.app_ctx_globals_class
    def _set_request_globals_class(self, value):
        from warnings import warn
        warn(DeprecationWarning('request_globals_class attribute is now '
                                'called app_ctx_globals_class'))
        self.app_ctx_globals_class = value
    request_globals_class = property(_get_request_globals_class,
                                     _set_request_globals_class)
    del _get_request_globals_class, _set_request_globals_class
     config_class = Config
     debug = ConfigAttribute('DEBUG')
    testing = ConfigAttribute('TESTING')
    secret_key = ConfigAttribute('SECRET_KEY')
    session_cookie_name = ConfigAttribute('SESSION_COOKIE_NAME')
    permanent_session_lifetime = ConfigAttribute('PERMANENT_SESSION_LIFETIME',
        get_converter=_make_timedelta)
    send_file_max_age_default = ConfigAttribute('SEND_FILE_MAX_AGE_DEFAULT',
        get_converter=_make_timedelta)
    use_x_sendfile = ConfigAttribute('USE_X_SENDFILE')
    logger_name = ConfigAttribute('LOGGER_NAME')
    json_encoder = json.JSONEncoder
    json_decoder = json.JSONDecoder
    jinja_options = ImmutableDict(
        extensions=['jinja2.ext.autoescape', 'jinja2.ext.with_']
    )
    default_config = ImmutableDict({
        'DEBUG':                                False,
        'TESTING':                              False,
        'PROPAGATE_EXCEPTIONS':                 None,
        'PRESERVE_CONTEXT_ON_EXCEPTION':        None,
        'SECRET_KEY':                           None,
        'PERMANENT_SESSION_LIFETIME':           timedelta(days=31),
        'USE_X_SENDFILE':                       False,
        'LOGGER_NAME':                          None,
        'LOGGER_HANDLER_POLICY':               'always',
        'SERVER_NAME':                          None,
        'APPLICATION_ROOT':                     None,
        'SESSION_COOKIE_NAME':                  'session',
        'SESSION_COOKIE_DOMAIN':                None,
        'SESSION_COOKIE_PATH':                  None,
        'SESSION_COOKIE_HTTPONLY':              True,
        'SESSION_COOKIE_SECURE':                False,
        'SESSION_REFRESH_EACH_REQUEST':         True,
        'MAX_CONTENT_LENGTH':                   None,
        'SEND_FILE_MAX_AGE_DEFAULT':            timedelta(hours=12),
        'TRAP_BAD_REQUEST_ERRORS':              False,
        'TRAP_HTTP_EXCEPTIONS':                 False,
        'EXPLAIN_TEMPLATE_LOADING':             False,
        'PREFERRED_URL_SCHEME':                 'http',
        'JSON_AS_ASCII':                        True,
        'JSON_SORT_KEYS':                       True,
        'JSONIFY_PRETTYPRINT_REGULAR':          True,
        'TEMPLATES_AUTO_RELOAD':                None,
    })
    url_rule_class = Rule
    test_client_class = None
    session_interface = SecureCookieSessionInterface()
    def __init__(self, import_name, static_path=None, static_url_path=None,
                 static_folder='static', template_folder='templates',
                 instance_path=None, instance_relative_config=False,
                 root_path=None):
        _PackageBoundObject.__init__(self, import_name,
                                     template_folder=template_folder,
                                     root_path=root_path)
        if static_path is not None:
            from warnings import warn
            warn(DeprecationWarning('static_path is now called '
                                    'static_url_path'), stacklevel=2)
            static_url_path = static_path
        if static_url_path is not None:
            self.static_url_path = static_url_path
        if static_folder is not None:
            self.static_folder = static_folder
        if instance_path is None:
            instance_path = self.auto_find_instance_path() #  !!!!!
        elif not os.path.isabs(instance_path):
            raise ValueError('If an instance path is provided it must be '
                             'absolute.  A relative path was given instead.')
        self.instance_path = instance_path
        self.config = self.make_config(instance_relative_config) # !!!!!
        self._logger = None
        self.logger_name = self.import_name
        self.view_functions = {}
        self._error_handlers = {}
        self.error_handler_spec = {None: self._error_handlers}
        self.url_build_error_handlers = []
        self.before_request_funcs = {}
        self.before_first_request_funcs = []
        self.after_request_funcs = {}
        self.teardown_request_funcs = {}
        self.teardown_appcontext_funcs = []
        self.url_value_preprocessors = {}
        self.url_default_functions = {}
        self.template_context_processors = {
            None: [_default_template_ctx_processor]
        }
        self.shell_context_processors = []
        self.blueprints = {}
        self._blueprint_order = []
        self.extensions = {}
        self.url_map = Map()
        self._got_first_request = False
        self._before_request_lock = Lock()
        if self.has_static_folder:
            self.add_url_rule(self.static_url_path + '/<path:filename>',
                              endpoint='static',
                              view_func=self.send_static_file) # !!!!!
        self.cli = cli.AppGroup(self)
    def _get_error_handlers(self):
        from warnings import warn
        warn(DeprecationWarning('error_handlers is deprecated, use the '
            'new error_handler_spec attribute instead.'), stacklevel=1)
        return self._error_handlers
    def _set_error_handlers(self, value):
        self._error_handlers = value
        self.error_handler_spec[None] = value
    error_handlers = property(_get_error_handlers, _set_error_handlers)
    del _get_error_handlers, _set_error_handlers
FishHook
py.user.next
Ты связал методы append() и insert() между собой и из-за этого ты теперь не сможешь их расширять (или исправлять в них баги). Потому что любое расширение одного метода будет ломать все методы, которые на нём основываются.
Давай предположим, что мы говорим не про методы, а про обычные функции, какая в принципе разница?
То есть ты учишь не вызывать функции внутри других функций, я правильно понимаю?
py.user.next
FishHook
Ранахера тоже в нубы записывай.
__init__ - это “приватный” метод, практически он относится к внутреннему содержимому объекта. То же самое касается методов с подчёркиваниями в начале.

FishHook
Давай предположим, что мы говорим не про методы, а про обычные функции, какая в принципе разница?
Большая разница. Методы - это объединённая группа функций (вокруг данных), образующая внешний интерфейс (готовый к плотному закреплению в другом коде).
Действие таких функций влияет на данные (может влиять), что и видно в твоём примере. Там в append'е переставляется указатель, потому что он должен переставляться, но в insert'е он тоже переставляется, хотя он не должен переставляться.
Чтобы убрать перестановку в insert'е, что нужно сделать? Правильно, нужно заново написать insert без ссылок на append и один раз переставить в конце.

Ты пойми одну вещь: поведение метода может меняться; сёдня он делает одно, а завтра нужно чтобы он делал то же самое, но по-другому. И вот тут-то ты и понимаешь, что тебе надо убрать какой-то побочный эффект, а ты не можешь его убрать, потому что в других местах он закрепился.

Как ты не понимаешь этой простой вещи? Значит, ты не пишешь нифига.
FishHook
py.user.next
Ты бредишь. Разговор закончен, с неадекватами предпочитаю не связываться.
J.R.
FishHook
пшшш…
а я настроился на как минимум недельный холивар с интересной дискуссией.

py.user.next
тебе плюс в карму.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB