나를 목표를 정의하여 시작하자 나는이 : 기본값은 없습니다 추상 클래스 멤버 (안 속성, 메서드, 또는 인스턴스 멤버)의 정의를 사용직접 metaclassed 클래스가 아닌 모든 하위 메타 클래스 규칙을 적용
값 (None 또는 다른 마법 값이 아니라 구현되지 않은 경우 오류가 발생 함).
(1)의 서비스에서 추상 멤버가있는 클래스를 작성하는 것이 쉬운 재사용 가능한 추상 메커니즘을 만들고 코드를 최대한 간결하게 만듭니다.
추상 클래스 멤버를 구체적인 클래스가 정의 될 때까지 정의하지 않아도되는 추상 클래스 멤버를 부모 클래스 (하위 클래스, 메타 클래스 또는 다른 수단으로)에 첨부 할 수 있습니다.
내가 지금까지있어 무엇 :
는metaclass_lib.py :
class AbstractRequiredClassMembersMetaclass(type):
def __new__(cls, name, bases, attrs):
missed_members = []
for class_member in cls.REQUIRED_CLASS_MEMBERS:
if class_member not in attrs:
missed_members.append(class_member)
if missed_members:
raise NotImplementedError('Class missing required members %s.' % missed_members)
return super(AbstractRequiredClassMembersMetaclass, cls).__new__(cls, name, bases, attrs)
class _MakeRequiredClassMemebersMetaclass(object):
existing_classes = {}
def __call__(self, name, required_members):
if name in _MakeRequiredClassMemebersMetaclass.exisiting_classes:
if required_members != _MakeRequiredClassMemebersMetaclass.exisiting_classes[name].REQUIRED_CLASS_MEMBERS:
raise RuntimeError('Class of name %s already defined with different required_members.' % name)
else:
NewClass = type(name, (AbstractRequiredClassMembersMetaclass,), {'REQUIRED_CLASS_MEMBERS' : required_members})
_MakeRequiredClassMemebersMetaclass.exisiting_classes[name] = NewClass
return _MakeRequiredClassMemebersMetaclass.exisiting_classes[name]
make_required_class_members_metaclass = _MakeRequiredClassMemebersMetaclass()
goods.py (그림 구현) :
from metaclass_lib import make_required_class_members_metaclass
class AbstractGood(object):
__metaclass__ = make_required_class_members_metaclass('AbstractGoodMeta', ('unit_measure',))
def __init__(self):
self.unit_price = None
def total_cost(self, number_of_units):
return self.unit_price * self.number_of_units
class DeliGood(AbstractGood):
unit_measure = 'lbs'
def __init__(self):
self.sandwich_counter_product = False
class RefridgeratedGood(AbstractGood):
unit_measure = 'package'
def __init__(self):
self.freezer_safe = False
self.optimal_temp = '35'
이되지 않습니다 AbstractGood
type
개체를 만드는 동안 메타 크라스가 찌르기 때문에 작업하십시오. 문제는 모든 구체적인 상품이 반원을 정의하기를 원하지만 나는 어떤 추상적 인 기초에서도 반원을 정의하고 싶지 않다. 내가 생각할 수있는 것은 키워드가 name
(예 : if 'Abstract' not in name
)이 아닌지 확인하기 위해 메타 클래스가 in attrs
만 수행하도록하는 것입니다.하지만 이는 잔잔하고 깨지기 쉬운 것 같습니다.
더 좋은 방법이 있나요?
예, 더 좋은 방법이 있습니다. Python 표준 라이브러리의 [ABC 모듈] (http://docs.python.org/library/abc.html)을 사용하십시오. – agf
@agf, 내가 이해하는 것 외에는 추상 클래스 멤버가 아닌 추상 메서드 및 속성 만 사용할 수 있습니다. –