首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >姜戈的Zope.interface

姜戈的Zope.interface
EN

Stack Overflow用户
提问于 2021-10-18 10:54:15
回答 1查看 48关注 0票数 0

我来自Java背景,现在正在开发一个django应用程序。如果我走错了方向,我需要你的输入。

我正在尝试在我的Django应用程序中实现zope.interface.Interface,并尝试实现Java语言中的接口所做的事情,但是如果实现者类没有提供接口中所有方法的定义,它就不会抛出任何错误。

下面是我的示例实现。

代码语言:javascript
复制
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))

请帮助我找出我做错了什么,并得到您亲切的指导。

谢谢,

EN

回答 1

Stack Overflow用户

发布于 2021-10-18 12:35:49

我将使用MetaClass而不是Zope Interface。以下是解决方案

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69614806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档