gpt4 book ai didi

c# - Python 的抽象类在实例化不完整的具体类时不返回错误

转载 作者:太空宇宙 更新时间:2023-11-03 12:32:53 24 4
gpt4 key购买 nike

我是一名习惯用C#编程的程序员,我正在尝试使用python的抽象类实现类似于C#接口(interface)的功能。

C#

如果我想确保某个类(下例中的 Concrete)具有某些属性或方法,我会创建一个接口(interface) IBase,并确保该类实现该接口(interface)。如果类没有实现所有必需的方法和属性,编译器将返回错误。

例子:

public interface IBase
{
void Foo();
void Bar();
}

public class Concrete : IBase
{
public void Foo()
{
Console.WriteLine("Foo is implemented");
}
}

结果:

Program.cs(25,33): error CS0535: 'Program.Concrete' does not implement interface member 'Program.IBase.Bar()'

python (2.7)

我试图在 python (2.7) 中实现类似的东西。通过使用抽象方法创建抽象类 Base,并使类 Concrete 成为该抽象类的子类。应该发生的是,如果控制台没有获得所有必需的方法和属性,则在实例化对象时会抛出错误,但在下面的示例中,程序似乎运行良好,直到实际调用了缺少的函数。

例子:

from abc import ABCMeta, abstractmethod

class Base:
_metaclass_ = ABCMeta

@abstractmethod
def Foo(self):
raise NotImplementedError()

@abstractmethod
def Bar(self):
raise NotImplementedError()

class Concrete(Base):
def Foo(self):
print "Foo is implemented"

c = Concrete()
c.Foo()
c.Bar()

结果:

Foo is implemented
Traceback (most recent call last):
File "temp.py", line 27, in <module>
c.Bar()
File "temp.py", line 19, in Bar
raise NotImplementedError()
NotImplementedError

如果有人能告诉我出了什么问题,我将不胜感激。

最佳答案

@johnsharpe 的评论是正确的:

class Base(object):
__metaclass__ = ABCMeta
@abstractmethod
def Foo(self):
raise NotImplementedError
@abstractmethod
def Bar(self):
raise NotImplementedError

class Concrete(Base):
def Foo(self):
print 'Foo is implemented'



>>> c = Concrete()

Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
c = Concrete()
TypeError: Can't instantiate abstract class Concrete with abstract methods Bar
>>>

关于c# - Python 的抽象类在实例化不完整的具体类时不返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42041738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com