实例化类时abstractmethod()的作用和影响分析
使用@example引入抽象方法
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius * self.radius
r = Rectangle(5, 10)
print(r.area()) # 输出50
c = Circle(2)
print(c.area()) # 输出12.56
继承了abc.ABC类,并在abstractmethod修饰器中声明了抽象方法area()。
当我们实例化一个类的时候,抽象方法area()必须被重写,并且在子类中实现具体的逻辑。如果在子类中没有重写抽象方法,或者在子类中没有实现抽象方法的具体逻辑,那么实例化类时就会报错。
在上面的例子中,我们定义了一个Shape类,并在其中声明了area()方法为抽象方法。然后,我们定义了两个子类,Rectangle和Circle,并在子类中分别重写了area()方法。
当我们实例化Rectangle类的时候,并调用area()方法,就会返回矩形的面积。同样地,当我们实例化Circle类的时候,并调用area()方法,就会返回圆的面积。
这样做的好处是,可以在父类中定义抽象方法,以提供一个接口,规定了子类必须要实现的方法。这样做有助于提高代码的可读性和可维护性,并且可以在父类中定义一些共有的方法和属性,使得代码更加结构化。
另外,抽象方法还可以用来限制对象的类型。比如,在上面的例子中,Shape类是抽象类,不能直接实例化,但是可以用来判断一个对象是否为Shape类型。
shape = Shape() # 报错,不能直接实例化抽象类
print(isinstance(r, Shape)) # 输出True
print(isinstance(c, Shape)) # 输出True
print(isinstance(shape, Shape)) # 输出False
这样,我们就可以通过检查一个对象是否为抽象类的实例来限制对象的类型,提高代码的安全性和可读性。
总结一下,@abstractmethod装饰器的作用是定义一个抽象方法,而实例化类时abstractmethod的影响是要求子类必须重写这个抽象方法并实现具体逻辑。abstractmethod还可以用来限制对象的类型,提高代码的安全性和可读性。
注意:实例化抽象类时abstractmethod()并不会对实例化的类做出限制,而是在子类化时,使用这个装饰器。当实例化子类时,对于没有在子类中实现的抽象方法,会抛出异常。
