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)
输出结果: 一个类它继承了一个类,但是它又改写了它父类的方法,这样在调用这个方法时,就会因为实例对象的不同而调用的方法不同,也就是说看这个实例对象实例化时是用父类实例化的,还是子类实例化的,是父类实例化的,结果就是父类的方法,是子类实例化的,结果就是子类的方法。
