抽象类实现不在python中工作

时间:2015-09-23 05:27:15

标签: python python-3.x abstract-class

我正在尝试在python中实现一个抽象类。以下是我的代码:

from abc import ABCMeta, abstractmethod

class Vehicle:
    __metaclass__ = ABCMeta

    def __init__(self, miles):
        self.miles = miles        

    def sale_price(self):
        """Return the sale price for this vehicle as a float amount."""
        if self.miles > 10000:
            return 20.0  
        return 5000.0 / self.miles

    @abstractmethod
    def vehicle_type(self):
        """"Return a string representing the type of vehicle this is."""
        pass

class Car(Vehicle):
    def vehicle_type(self):
        return 'car'

def main():
    veh = Vehicle(10)
    print(veh.sale_price())
    print(veh.vehicle_type())

if __name__ == '__main__':
    main()

这可以完美执行而不会出现任何错误。 main()不应该抛出我Can't instantiate abstract class Base with abstract methods value的错误吗?我究竟做错了什么?我正在使用python 3.4

2 个答案:

答案 0 :(得分:2)

您正在使用定义metaclass的Python 2.x方法,对于Python 3.x,您需要执行以下操作 -

class Vehicle(metaclass=ABCMeta):

这是通过PEP 3115 - Metaclasses in Python 3000

引入的

出现问题是因为对于使用@abstractmethod装饰器,要求类的元类是ABCMeta或从中派生出来。正如the documentation -

中所述
  

<强> @ abc.abstractmethod

     

指示抽象方法的装饰者。

     

使用此装饰器要求类的元类是ABCMeta,或者是从它派生的。

(强调我的)

答案 1 :(得分:0)

U在 init 方法中包含一个引发异常,以便在Python2.x中使用

for slc in list_of_slices:
    df["time"][slc] = (df["time"][slc]).iloc[-1] 

这不允许实例化抽象类。