python面向对象的三大特征
1.封装:
封装就是对类和对象的成员访问进行限制,设定可以访问的方式和不可以访问的方式。
分类:
私有化的封装:当前类/对象种可以使用,类/对象外和子类/对象都不可以用
受保护的封装:当前类/对象和子类/子类对象可以使用门,类/对象外不可以使用
公共的封装:任何位置都可以访问!
例:
class Father: #属性 sex = '男' age = 48 #私有化封装 #标志就是在属性或者方法前加两个下划线 __wife = '肤白貌美大长腿~' #受保护的封装 #加一个下划线 _money = 100 #方法 def _say(self): print('受保护的封装') def __eat(self): print('私有化封装')
class Son(Father):
#此处可以使用受保护的成员
def buy(self):
print('爸爸一共有',self._money,'钱')
#实例化儿子对象
s = Son()
s.buy()
2.继承:
继承就是可以获取另外一个类中的成员属性和成员方法。(并非所有成员)
父类:用于被继承的类,称之为父类,也叫做基类,或者超类
子类:继承其他类的类,称之为子类,也叫做派生类
继承的好处
- 建造系统中的类,避免重复操作。
- 新类经常是基于已经存在的类,这样就可以提升代码的复用程度。
继承的特点
- 在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于C#
- 在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
- Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
分类:
单继承:每个类只能继承一个类的方式称为单继承。
格式:
class 父类: pass class 子类(父类):#继承操作的关键步骤 pass
多继承:每个类可以同时继承多个类的方式称为多继承。
格式:
class 父类1: pass class 父类2: pass class 子类(父类1,父类2): pass
菱形继承:
格式:
class A: pass class B(A): pass class C(A): pass class D(B,C): pass A / \ B C \ / D
菱形存在的问题:
如果BC类同时继承了A类,D类又继承了BC两个类的情况下(菱形继承),
在调用BC中某个同名方法(该方法都继承自A类)时会导致继承自A类的该方法被多次调用。产生逻辑问题!
所以python使用 super() 类来解决了多继承的菱形继承问题
super(): 格式:super().方法()
super不是一个关键字,也是不是有函数,他是一个类
super()的作用不是查找父类,而是找MRO列表的上一个类
super()和父类没有任何实质性的关系,只是有时候能调用到父类而已。
在单继承的情况下,super()永远调用的是父类/父对象
3.多态:
我们在有一些方法在父类已经定义好了,但是子类我们自己再用的时候,发现,其实,我们的虽然都是计算工资的,但是普通员工的工资计算方法跟经理的计算方法是不一样的,所以这个时候,我们就不能直接调用父类的这个计算工资的方法了。这个时候我们就需要用到面向对象的另一个特性,多态。我们要在子类里面把父类里面定义计算工资的方法在子类里面重新实现一遍。多态包含了重载和重写。
这里就不举例了,上两张图片吧!
重写
重写很简单就是把子类从父亲类里继承下来的方法重新写一遍,这样,父类里相同的方法就被覆盖了,当然啦,你还是可以通过super.CaculSalary方法来调用父类的工资计算方法。
重载
重载就是类里面相同方法名,不同形参的情况,可以是形参类型不同或者形参个数不同,或者形参顺序不同,但是不能使返回值类型不同。