Да, вы можете и ваш администратор базы данных будет ненавидеть вас, и вы обнаружите, что вы прибиваете ботинки к полу, потому что это вызовет множество операций ввода-вывода и приведет к снижению производительности базы данных по мере очистки кеша.
select column_name from all_tab_columns c, user_all_tables u where c.table_name = u.table_name;
для начала.
Я бы начал с запущенных запросов, используя v$session
и v$sqlarea
. Это изменяется в зависимости от версии oracle. Это сократит пространство и не ударит все.
Для этого у Python есть встроенное исключение, хотя вы не столкнетесь с этим исключением до времени выполнения.
class Base(object):
@property
def path(self):
raise NotImplementedError
class SubClass(Base):
path = 'blah'
Реализация Python3.6 может выглядеть так:
In [20]: class X:
...: def __init_subclass__(cls):
...: if not hasattr(cls, 'required'):
...: raise NotImplementedError
In [21]: class Y(X):
...: required =5
...:
In [22]: Y()
Out[22]: <__main__.Y at 0x7f08408c9a20>
В ответе Бастиана Леонарда упоминается модуль абстрактного базового класса, и ответ Брендана Абеля касается не реализованных атрибутов, вызывающих ошибки. Чтобы гарантировать, что класс не реализован вне модуля, вы можете префикс базового имени с подчеркиванием, которое обозначает его как закрытое для модуля (т. Е. Оно не импортируется).
i.e.
class _Controller(object):
path = '' # There are better ways to declare attributes - see other answers
class MyController(_Controller):
path = '/Home'
_Controller
? Duck Typing не вступает в силу, если уже есть (недопустимое) значение. В противном случае в какой-то момент, когда мне нужно определить поле path
, которое будет определено, ошибки не будет, потому что уже есть значение.
– deamon
29 April 2010 в 11:25
class AbstractStuff:
@property
@abc.abstractmethod
def some_property(self):
pass
По состоянию на 3.3 abc.abstractproperty
, я считаю, что это не рекомендуется.
Ваш базовый класс может реализовать метод __new__
, который проверяет атрибут класса:
class Controller(object):
def __new__(cls, *args, **kargs):
if not hasattr(cls,'path'):
raise NotImplementedError("'Controller' subclasses should have a 'path' attribute")
return object.__new__(cls,*args,**kargs)
class C1(Controller):
path = 42
class C2(Controller):
pass
c1 = C1()
# ok
c2 = C2()
# NotImplementedError: 'Controller' subclasses should have a 'path' attribute
Таким образом, ошибка возникает при создании экземпляра
Вы можете создать атрибут в базовом классе abc.ABC с таким значением, как NotImplemented
, чтобы, если атрибут не переопределяется, а затем используется, ошибка отображается во время выполнения.
Следующий код использует подсказку типа PEP 484 , чтобы помочь PyCharm правильно статически проанализировать тип атрибута path
.
import abc
class Controller(abc.ABC):
path = NotImplemented # type: str
class MyController(Controller):
path = '/home'
Для этого есть декоратор @abstractproperty :
from abc import ABCMeta, abstractmethod, abstractproperty
class A:
__metaclass__ = ABCMeta
def __init__(self):
# ...
pass
@abstractproperty
def a(self):
pass
@abstractmethod
def b(self):
pass
class B(A):
a = 1
def b(self):
pass
Невозможно объявить a
или b
в производный класс B
поднимет значение TypeError
, например:
TypeError
: не может создать абстрактный классB
с абстрактными методамиa
Python 3.3 +
Устаревший с версии 3.3: теперь можно использовать
property
,property.getter()
,property.setter()
иproperty.deleter()
сabstractmethod()
, что делает этот декоратор избыточным.Вышеприведенный пример является следующим:
from abc import ABCMeta, abstractmethod class A(metaclass=ABCMeta): def __init__(self): # ... pass @property @abstractmethod def a(self): pass @abstractmethod def b(self): pass class B(A): a = 1 def b(self): pass
NotImplementedError
является более явным и, следовательно, вероятно лучше, чем оставить его вAttributeError
. – blokeley 29 April 2010 в 13:48path
устанавливается непосредственно наSubClass
. Учитывая экземплярsc = SubClass()
, если вы пытаетесь установитьsc.path = 'blah'
или иметь метод, который содержит что-то вродеself.path = 'blah'
без указанияpath
непосредственно наSubClass
, вы получитеAttributeError: can't set attribute
. – erik 31 March 2015 в 16:59