Created
January 4, 2012 11:40
-
-
Save huseyinyilmaz/1559689 to your computer and use it in GitHub Desktop.
Sample Interface implementation in python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| This is my interface functionality implementation using abc | |
| """ | |
| import abc | |
| from django.db import models | |
| from django.contrib.contenttypes.models import ContentType | |
| from django.contrib.contenttypes.generic import GenericForeignKey | |
| class AbstractBase(): | |
| """ | |
| Abstract class that used as interface | |
| This class makes sure that child classes have | |
| my_method implemented | |
| """ | |
| __metaclass__ = abc.ABCMeta | |
| @abc.abstractmethod | |
| def my_method(self): | |
| return | |
| class MyModel(models.Model): | |
| def my_method(self): | |
| return 1 | |
| AbstractBase.register(MyModel) | |
| class MyOtherModel(models.Model): | |
| def my_method(self): | |
| return 2 | |
| AbstractBase.register(MyOtherModel) | |
| class MyModelConsumer(models.Model): | |
| """ | |
| This object uses content_object generic foreign key in | |
| its algorithms. There should be a better way of | |
| """ | |
| content_type = models.ForeignKey(ContentType) | |
| object_id = models.PositiveIntegerField() | |
| content_object = GenericForeignKey() | |
| def use_object(self): | |
| self.content_object.my_method() | |
| def assign_object(self, obj): | |
| "object must inherit Abstract Base" | |
| self.content_object = obj |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| Sample interface using zope.interface | |
| (Does not do any validation at all) | |
| """ | |
| from django.db import models | |
| from django.contrib.contenttypes.models import ContentType | |
| from django.contrib.contenttypes.generic import GenericForeignKey | |
| from zope import interface | |
| class IBase(interface.Interface): | |
| """ | |
| This class makes sure that child classes have | |
| my_method implemented | |
| """ | |
| def my_method(self): | |
| return | |
| class MyModel(models.Model): | |
| interface.implements(IBase) | |
| def _my_method(self): | |
| return 1 | |
| class MyOtherModel(models.Model): | |
| interface.implements(IBase) | |
| def my_method(self): | |
| return 2 | |
| class MyModelConsumer(models.Model): | |
| """ | |
| This object uses content_object generic foreign key in | |
| its algorithms. There should be a better way of | |
| """ | |
| content_type = models.ForeignKey(ContentType) | |
| object_id = models.PositiveIntegerField() | |
| content_object = GenericForeignKey() | |
| def use_object(self): | |
| self.content_object.my_method() | |
| def assign_object(self, obj): | |
| assert IBase.provided_by(obj) | |
| "object must inherit Abstract Base" | |
| self.content_object = obj |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment