Предположим, у вас есть два класса X & Y. Вы хотите украсить эти классы, добавив атрибуты в класс для создания новых классов X1 и Y1.
Например:
class X1(X):
new_attribute = 'something'
class Y1(Y):
new_attribute = 'something'
new_attribute всегда будет одинаковым для X1 и Y1. X & Y никак не связаны между собой, за исключением того, что множественное наследование невозможно. Существует также ряд других атрибутов, но это вырожденно для иллюстрации.
Мне кажется, что я слишком усложняю это, но я думал использовать декоратор, как-то так:
def _xywrap(cls):
class _xy(cls):
new_attribute = 'something'
return _xy
@_xywrap(X)
class X1():
pass
@_xywrap(Y)
class Y1():
pass
Такое ощущение, что мне не хватает довольно распространенного паттерна, и я был бы очень благодарен за мысли, отзывы и отзывы.
Спасибо, что прочитали.
Brian
РЕДАКТИРОВАТЬ: Пример:
Вот соответствующая выдержка, которая может загореться. Общие классы следующие:
from google.appengine.ext import db
# I'm including PermittedUserProperty because it may have pertinent side-effects
# (albeit unlikely), which is documented here: [How can you limit access to a
# GAE instance to the current user][1].
class _AccessBase:
users_permitted = PermittedUserProperty()
owner = db.ReferenceProperty(User)
class AccessModel(db.Model, _AccessBase):
pass
class AccessExpando(db.Expando, _AccessBase):
pass
# the order of _AccessBase/db.* doesn't seem to resolve the issue
class AccessPolyModel(_AccessBase, polymodel.PolyModel):
pass
Вот поддокумент:
class Thing(AccessExpando):
it = db.StringProperty()
Иногда Thing имеет следующие свойства:
Thing { it: ... }
И другие времена:
Thing { it: ..., users_permitted:..., owner:... }
Мне не удалось понять, почему иногда у Thing есть свойства _AccessParent, а иногда нет.