【问题标题】:Zope.interface in DjangoDjango 中的 Zope.interface
【发布时间】:2021-10-18 10:54:15
【问题描述】:

我来自 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))

请帮助我找出我做错了什么以及您的善意指导。

谢谢,

【问题讨论】:

    标签: python django oop zope.interface


    【解决方案1】:

    我将使用 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()
    
    

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 2015-05-24
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2017-06-15
      • 2011-10-21
      相关资源
      最近更新 更多