Включение отчета об ошибках является правильным решением, однако оно, похоже, не вступает в силу в программе, которая включает его, но только в последующих программах.
Таким образом, я всегда создаю файл / (который я обычно называю «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¶m=val').done(function(data) { /* ... */
Если вы не хотите нарушать принцип DRY, как предлагает falsetru, вам нужно будет использовать метаклассы. Я думал писать что-то, но уже есть хорошее длинное описание метаклассов на SO , поэтому проверьте его.
Метаклассы, короче говоря, позволяют управлять созданием подкласса.
В основном, что вам нужно сделать, после создания подкласса Parent
добавьте член _id
в вновь созданный подкласс.
Как вы сказали в вопросе, _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)
Если вам действительно нужно использовать идентификатор таким образом, используйте параметры:
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
напрямую , но это выглядит разумно с вашим примером кода.