python面向对象的三大特性
前言
Python是面向对象的语言,也支持面向对象编程的三大特性:封装(隐藏)、继承、多态。
一、封装(隐藏)
隐藏对象的属性和实现细节,只对外提供必要的方法。相当于将"细节封装起来",只对外暴露“相关调用方法”。通过私有属性、私有方法的方式实现封装。
Python追求简洁的语法,没有严格的语法级别的"访问控制符",更多的是依靠程序员的自觉实现。
二、继承
如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低了工作难度,已有的类,我们称为"父类或基类",新的类,我们称为“子类或派生类”。
继承可以让子类具有父类的特性,提高了代码的重用性。
Python支持多重继承,一个子类可以继承多个父类,继承的语法格式如下:
class 子类类名(父类1,父类2,…): 类体
类成员的继承和重写:
-
成员继承:子类继承了父类除构造方法之外的所有成员。 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类中的方法,也称为重写。
class Person: def __init__(self,name,age): self.name=name self.__age=age def say_age(self): print("我的年龄是",self.__age) def say_introduce(self): print("我的名字是{}".format(self.name)) class Student(Person): def __init__(self,name,age,score): Person.__init__(self,name,age) self.score=score def say_introduce(self): print("我的名字是{}".format(self.name)) s=Student("李四",18,100) s.say_age() s.say_introduce()
输出结果: 重写__str__方法:
用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮助我们查看对象的信息。str()可以重写。
class Person(): def __init__(self,name): self.name=name p=Person("李四") print(p)
输出结果: str()重写后:
class Person(): def __init__(self,name): self.name=name def __str__(self): return "名字是:{}".format(self.name) p=Person("李四") print(p)
输出结果: 关于多重继承:
Python支持多重继承,一个子类可以有多个“直接父类”,这样就具备了多个父类的特点,但是由于这样会把“类的整体层次”搞得很复杂,尽量避免使用。
class A: def aa(self): print("aa") class B: def bb(self): print("bb") class C(A,B): def cc(self): print("cc") c=C() c.aa() c.bb() c.cc()
输出结果:
三、多态
多态(polymorphism)是指同一个方法调用,由于对象不同可能会产生不同的行为。
注意:
-
多态是方法的多态,属性没有多态 多态的存在有两个必要条件:继承、方法重写
class Man: def eat(self): print("世界和平!") class Chinese(Man): def eat(self): print("中国人") class English(Man): def eat(self): print("英国人") class American(Man): def eat(self): print("美国人") def manEat(m): if isinstance(m,Man): m.eat() else: print("其他人") manEat(Chinese()) manEat(English()) manEat(American()) #Person这个实例化对象,父类实例化的 Person=Man() manEat(Person)
输出结果: 一个类它继承了一个类,但是它又改写了它父类的方法,这样在调用这个方法时,就会因为实例对象的不同而调用的方法不同,也就是说看这个实例对象实例化时是用父类实例化的,还是子类实例化的,是父类实例化的,结果就是父类的方法,是子类实例化的,结果就是子类的方法。