我正在尝试在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
答案 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]
这不允许实例化抽象类。