python - Django 中的 Zope.interface
问题描述
我来自 Java 背景,现在正在开发 django 应用程序。如果我的方向错误,需要您的意见。
我正在尝试在我的 Django 应用程序中实现 zope.interface.Interface 并尝试实现 Java 中的接口,但如果实现者类没有提供接口中所有方法的定义,它不会引发任何错误。
这是我的示例实现。
import zope.interface
class MyInterface(zope.interface.Interface):
x = zope.interface.Attribute("foo")
def method1(self, x):
pass
def method2(self):
pass
@zope.interface.implementer(MyInterface)
class MyClass:
def method1(self, x):
return x**2
def method2(self):
return "foo"
@zope.interface.implementer(MyInterface)
class MyClass2:
def method1(self, x):
return x**2
print(list(zope.interface.implementedBy(MyClass)))
print(list(zope.interface.implementedBy(MyClass2)))
c = MyClass()
print(c.method1(5))
print(c.method2())
d = MyClass2()
print(d.method1(5))
请帮助我找出我做错了什么以及您的友好指导。
谢谢,
解决方案
我将使用 MetaClass 而不是 Zope 接口。这是解决方案
class IStudent(type):
def __new__(cls, name, bases, attrs):
print("New from Interface")
x = super().__new__(cls, name, bases, attrs)
# Functions to be implemented
if(not hasattr(x, 'test')):
x.test = lambda self: print("Method not implemented")
return x
class Student1(metaclass=IStudent):
def __init__(self):
print("Init from Student1")
class Student2(metaclass=IStudent):
def __init__(self):
print("Init from Student2")
def test(self):
print("This is implemented method from Student 2")
std1 = Student1()
std2 = Student2()
std1.test()
std2.test()
推荐阅读
- javascript - python selenium,克服javascript弹出窗口
- r - 在 glmtree() 之后在 plot() 中使用终端面板
- redis - 将新的 redis 节点添加到现有集群
- reactjs - Ag-Grid - 如何在同一个网格中制作两个水平滚动?
- typescript - Vuetify Switcher I18N 翻译
- javascript - 我使用simpleLogger获取响应内容时,获取的信息是乱码
- javascript - 为什么这个 ajax 给我一个 400 错误?
- elasticsearch - elasticsearch嵌套查询,嵌套obj中的每个项目都具有相同的某个键值
- python - 为什么'str'没有属性'name'(PyCharm 2020.3.2 Python 3.9)
- javascript - 片段中的 Web 视图