最近在学习Python函数和面向对象,其实对于新手的我来说还是有点让我迷茫的,不过经过这两天的学习我找一个了例题给大家分享一下。
? ? ? ? ? ? ? ? ??
?
以点(Point)类为基类,重新定义矩形类和圆类。点为直角坐标点,矩形水平放置,由左 下方的顶点和长宽定义。圆由圆心和半径定义。派生类操作判断任一坐标点是在图形内,还 是在图形的边缘上,还是在图形外。编程测试类设计是否正确。
class Shape : #定义形状类并写计算周长面积的方法
def area(self):
pass
def perimeter(self):
pass
class Rectangle(Shape): #定义长方形继承shape
c = 0
k = 0
def __init__(self,c,k):
self.c = c
self.k = k
def area(self):
return self.c * self.k
def perimeter(self):
return 2 * self.c + 2 * self.k
class Square(Shape): #此处继承的还是shape,此处还有一个思路就是
side = 0 #将长方形的长或者宽定义为私有的属性,正方形可以继承长方形
def __init__(self,side):
self.side = side
def area(self):
return self.side**2
def perimeter(self):
return 4 * self.side
class Circle(Shape): #圆形和矩形没有相同属性,所以不继承
r = 0
def __init__(self,r):
self.r = r
def area(self):
return self.r**2 * 3.14
def perimeter(self):
return self.r * 2 * 3.14
class Annulus(Circle): #圆环和圆形有共有属性半径,但是圆环还要定义一个新的属性
r1 = 0
def __init__(self,r,r1):
super().__init__(r)
self.r1 = r1
def area(self):
return super().area() - 3.14 * self.r1**2
def perimeter(self):
return super().perimeter() + self.r1 * 2 *3.14
rectangle = Rectangle(10,5)
print(rectangle.perimeter())
print(rectangle.area())
square = Square(4)
print(square.area())
print(square.perimeter())
circle = Circle(1)
print(circle.area())
print(circle.perimeter())
annulus = Annulus(20,10)
print(annulus.perimeter())
print(annulus.area())
在加一些继承的知识点吧!!!!
单继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承用于指定一个类将从其父类获取其大部分或全部功能。 它是面向对象编程的一个特征。这是一个非常强大的功能,方便用户对现有类进行几个或多个修改来创建一个新的类。新类称为子类或派生类,从其继承属性的主类称为基类或父类。 子类或派生类继承父类的功能,向其添加新功能。 它有助于代码的可重用性。 继承的语法如下所示。 1??class 派生类(基类1,基类2,...): 2??派生类类内语句 class 派生类(基类): 派生类类内语句 只需要继承基类这个动作,就可以访问到基类的属性和方法了,它提高了代码的可扩展性。 如果派生类中有__init__()方法,那么基类的__init__()方法不会被自动调用,它需要在其派生类的构造中专门调用。 ? 如果派生类中没有__init__()方法,且基类中有__init__()方法,那么基类的__init__()方法会被自动调用 ? 调用父类的方法有三种: ? 方法1: 父类名字.父类中的方法名(self,[参数1,参数2,参数3,……]) 方法2: super().父类中的方法名([参数1,参数2,参数3,……]) 方法3: super(当前类的名字,self).父类中的方法名([参数1,参数2,参数3,……]) 在python中继承中的一些特点: Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。 ?
?
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
print("Person类__init__()。", "姓名:", self.name)
class Student(Person):
def __init__(self, name, gender, score):
super().__init__(name, gender)
self.score = score
print("Student类__init__()。", "姓名:", self.name)
student = Student('tom','male',10)
任何事情都有利有弊:继承的一个弱点就是,可能特殊的类又有其他特殊的地方,又会定义一个类,其下也可能再定义类, 这样就会造成继承的那条线越来越长,使用继承的话,任何一点小的变化也需要重新定义一个类,很容易引起类的爆炸式增长, 产生一大堆有着细微不同的子类。所以有个“多用组合少用继承”的原则。
|