Skip to content

Instantly share code, notes, and snippets.

@huseyinyilmaz
Created January 4, 2012 11:40
Show Gist options
  • Select an option

  • Save huseyinyilmaz/1559689 to your computer and use it in GitHub Desktop.

Select an option

Save huseyinyilmaz/1559689 to your computer and use it in GitHub Desktop.
Sample Interface implementation in python
"""
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
"""
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