Python–抽象类和抽象方法
写一道题之前,要知道方法是什么:
抽象类与普通类的不同之处是:抽象类里面通常包含抽象方法(没有实现功能),并且该类不能被实例化,只能被继承,且派生类必须实现抽象类中的抽象方法
使用抽象基类需要导入abc模块
@abc.abstractmethod
def tending(self):
pass
def tending(self):
print("小羊辛勤的放羊......") l1=Lamb() l1.tending()
本题还涉及到其他的一些知识点:
类的特殊方法
较常见的:构造方法**init()** 和析构方法 del() 下面用到了构造方法 init() :用来为类中的成员设置初始值或进行必要的初始化工作,在类实例化时被自动调用和执行。 (具体可以体会体会下面这道题,或者去百度、看书其他博客看看,了解了解)
编程实现如下功能:
(1)定义一个抽象类Shape,在抽象类 Shape中定义求面积 getArea()和周长 getPerimeter()的抽象方法。 (2)分别定义继承抽象类Shape的3个子类即Triangle(三角形)、Rectangle(矩形)、和Circle(圆),在这3个子类中重写 Shape中的方法getArea()和 getPerimeter( )。 (3)分别创建类Triangle的对象t1,创建类Rectangle的对象r1,创建类Circle的对象c1,并输入所需的边长和半径,分别调用对象t1、r1、c1的getArea方法和getPerimeter(),输出各个对象的面积和周长。(求圆的周长和面积时π值取3.14)
sys模块:提供对Python解释器的相关操作 import sys sys.exit(0) #退出程序 math模块:Python中的数学模块
具体代码如下:
import abc
import math
import sys
class Shape(metaclass=abc.ABCMeta):
@abc.abstractmethod
def getArea(self):
pass
def getPerimeter(self):
pass
class Triangle(Shape):
def __init__(self,a1,a2,a3):
if a1+a2>a3 and a3+a2>a1 and a1+a3>a2:
self.a1=a1
self.a2=a2
self.a3=a3
else:
print("输入的三边不能构成三角形")
sys.exit(0)
def getArea(self):
return 1/4*math.sqrt((self.a1+self.a2+self.a3))*(self.a1+self.a2-self.a3)*(self.a1-self.a2+self.a3)*(self.a2+self.a3-self.a1)
def getPerimeter(self):
return self.a1+self.a2+self.a3
class Rectangle(Shape):
def __init__(self,b1,b2):
self.b1=b1
self.b2=b2
def getArea(self):
return self.b1*self.b2
def getPerimeter(self):
return (self.b1+self.b2)*2
class Circle(Shape):
def __init__(self,r1):
self.r1=r1
def getArea(self):
return self.r1*self.r1*3.14
def getPerimeter(self):
return 2*self.r1*3.14
if __name__=='__main__':
a1=eval(input("请输入三角形的边长a1:"))
a2 = eval(input("请输入三角形边长a2:"))
a3 = eval(input("请输入三角形边长a3:"))
t1=Triangle(a1,a2,a3)
print(f"三角形面积={t1.getArea()}")
print(f"三角形周长={t1.getPerimeter()}")
b1 = eval(input("请输入矩形边长b1:"))
b2 = eval(input("请输入矩形边长b2:"))
r1 = Rectangle(b1, b2)
print(f"矩形面积={r1.getArea()}")
print(f"矩形周长={r1.getPerimeter()}")
r1 = eval(input("请输入圆的半径r1:"))
c1 = Circle(r1)
print(f"圆面积={c1.getArea()}")
print(f"圆周长={c1.getPerimeter()}")
最后创建对象调用上面方法的还可以这样写:
def main():
a1=eval(input("请输入三角形的边长a1:"))
a2 = eval(input("请输入三角形边长a2:"))
a3 = eval(input("请输入三角形边长a3:"))
t1=Triangle(a1,a2,a3)
print(f"三角形面积={t1.getArea()}")
print(f"三角形周长={t1.getPerimeter()}")
b1 = eval(input("请输入矩形边长b1:"))
b2 = eval(input("请输入矩形边长b2:"))
r1 = Rectangle(b1, b2)
print(f"矩形面积={r1.getArea()}")
print(f"矩形周长={r1.getPerimeter()}")
r1 = eval(input("请输入圆的半径r1:"))
c1 = Circle(r1)
print(f"圆面积={c1.getArea()}")
print(f"圆周长={c1.getPerimeter()}")
main()
小羊放羊ing…(亲亲,一起努力呀!走,放羊去!)
|