Python的抽象类在不完整的具体类的实例化时没有返回错误

时间:2017-02-04 14:52:31

标签: c# python abstract-class

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

C#

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

示例:

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)中实现similair。通过使用抽象方法创建一个抽象类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

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

1 个答案:

答案 0 :(得分:1)

@ johnsharpe的评论是正确的: