Переменные класса наследования класса Python [duplicate]

Включение отчета об ошибках является правильным решением, однако оно, похоже, не вступает в силу в программе, которая включает его, но только в последующих программах.

Таким образом, я всегда создаю файл / (который я обычно называю «genwrap.php»), который имеет по существу тот же самый код, что и популярное решение здесь (т. е. включить отчет об ошибках), а также включает в себя страницу, которую я действительно хочу вызвать.

Есть два шага для реализации этой отладки:

One - создать genwrap.php и поместить в него этот код:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

include($_REQUEST['page']);
?>

Two - изменить ссылку на программу / страницу вы хотите отлаживать переход через genwrap.php,

Например: change:

$.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */

to

$.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */
8
задан falsetru 1 November 2013 в 04:14
поделиться

3 ответа

Если вы не хотите нарушать принцип DRY, как предлагает falsetru, вам нужно будет использовать метаклассы. Я думал писать что-то, но уже есть хорошее длинное описание метаклассов на SO , поэтому проверьте его.

Метаклассы, короче говоря, позволяют управлять созданием подкласса.

В основном, что вам нужно сделать, после создания подкласса Parent добавьте член _id в вновь созданный подкласс.

3
ответ дан Community 20 August 2018 в 21:50
поделиться

Как вы сказали в вопросе, _id разделяется родительским и всеми дочерними классами. Определите _id для каждого класса детей.

from itertools import count

class Parent(object):
    base_id = 0
    _id = count(0)

    def __init__(self):
        self.id = self.base_id + self._id.next()


class Child1(Parent):
    base_id = 100
    _id = count(0) # <-------
    def __init__(self):
        Parent.__init__(self)
        print 'Child1:', self.id

class Child2(Parent):
    base_id = 200
    _id = count(0) # <-------
    def __init__(self):
        Parent.__init__(self)
        print 'Child2:', self.id

c1 = Child1()                   # 100
c2 = Child2()                   # 200
c1 = Child1()                   # 101
c2 = Child2()                   # 201

UPDATE

Использование метакласса:

class IdGenerator(type):
    def __new__(mcs, name, bases, attrs):
        attrs['_id'] = count(0)
        return type.__new__(mcs, name, bases, attrs)

class Parent(object):
    __metaclass__ = IdGenerator
    base_id = 0
    def __init__(self):
        self.id = self.base_id + next(self._id)
2
ответ дан falsetru 20 August 2018 в 21:50
поделиться

Если вам действительно нужно использовать идентификатор таким образом, используйте параметры:

class Parent(object):
    def __init__(self, id):
        self.id = id

class Child1(Parent):
    _id_counter = count(0)
    def __init__(self):
        Parent.__init__(self, 100 + self._id_counter.next())
        print 'Child1:', self.id

и т. д.

Это предполагает, что вы не будете создавать экземпляры Parent напрямую , но это выглядит разумно с вашим примером кода.

5
ответ дан jpmc26 20 August 2018 в 21:50
поделиться
Другие вопросы по тегам:

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