面向对象
写在前面
面向过程(POP
):以过程为中心,写步骤。分析出解决问题所需的步骤,然后用函数把这写步骤实现,并按顺序调用。
优点:性能好,开销小(内存量小)。
缺点:没有面向对象易维护、易复用、易扩展。
面向对象 (OOP
):以对象为中心,即把事物按照共性特征的对象整体化成为一类,继而描述解决问题步骤中的行为。
优点:易维护、易复用、易扩展。
缺点:需要实例化,开销大,性能低。
对象:
对象有属性和行为两方面特征。
万物皆可对象!每一个特殊的个体都可以看成是一个对象。法拉利是一个对象,他有车型、驱动系统这两个属性,有行驶这个行为。兰博基尼说巧了,俺也一样。于是他们和千万兄弟姐妹被称为车类。
类:
是把许多对象根据共同的属性和行为抽象为一个整体。如车类、人类…对象可以抽象为类,互逆的,类实例化就是对象。也可以把类看成是一个模板。实例化就是套模板的过程。
import math
class Circle1:
def __int__(self, r):##属性
self.r = r
def square(self):##行为
print(self.r*self.r*math.pi)
circle = Circle1(2)##实例化
circle.squre()
面向对象三特征:
封装:
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
封装原则:将不需要对外提供的内容都隐藏起来、把属性都隐藏,提供公共方法对其访问。
class Account:
def __int__(self, account):
self.__c = account
def __password__(self):
print(f"不能修改")
继承:
在面向对象的程序设计中,允许在已有类的基础上通过增加新特征而派生出新的类,这称为继承。其原有的类称为基类(base class),而新建立的类称为派生类(derived class);
子类可以得到父类的属性和行为
import math
class Shape:##父类
def __int__(self, name):
self.name = name
def square(self):
print(f"面积是")
def length(self):
print()
class Circle(Shape):##子类
def __int__(self, r):##新的属性,但原来名字的属性也会被继承。
self.r = r
def square(self):
print(self ** 2 * math.pi)
class Rectangle(Shape):
def __int__(self, width, height):
self.a = width
self.b = height
def square(self):
print(self.a * self.b)
多态:
多态是同一个行为具有多个不同表现形式或形态的能力,例如:黑白打印机和彩色打印机相同的打印行为却有着不同的打印效果。
-
对象类型和引用类型之间存在着继承(类)/ 实现(接口)的关系;
-
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
-
如果子类重写了父类的方法,最终执行的是子类覆盖的方法,如果没有则执行的是父类的方法。
class WhoSay: def say(self,who): who.say() class CLanguage: def say(self): print("调用的是 Clanguage 类的say方法") class CPython(CLanguage): def say(self): print("调用的是 CPython 类的say方法") class CLinux(CLanguage): def say(self): print("调用的是 CLinux 类的say方法") a = WhoSay() #调用 CLanguage 类的 say() 方法 a.say(CLanguage()) #调用 CPython 类的 say() 方法 a.say(CPython()) #调用 CLinux 类的 say() 方法 a.say(CLinux())