一、面向对象编程三大特征
Python是面向对象的语言,同样支持面向对象的编程的三大特征:继承,封装,多态。
封装是指隐藏对象的属性和实现细节,只对外提供必要的一些方法,私有属性,私有方法是实现封装地 一些方法。
继承是实现代码重用的方法,可以极大避免代码的重用,同时还可以在继承的基础上进行重构。
多态可以按字面意思理解为“多种状态”,在编程中是指一个方法调用但是由于对象不同而产生的不同结果。
三、继承
语法格式
Class 子类类名(父类)
类体
如果在类定义中没有指定父类,则默认父类是object 类。也就是说,object 是所有类的父
类。
如果定义子类时,有多个父类,也叫多继承。
class Student: # 定义基本属性 n = 'Bob' a = 0 # 定义私有属性,私有属性在类外部无法直接进行访问 __w = 0 # 定义构造方法 def __init__(self, n, a, w): self.n = n self.a = a self.__w = w def know(self): #类内部可以直接调用 print('my weight is: ',Student.__w ) print("%s say: I’m %d years old。" % (self.n, self.a)) #继承于父类Student, People也叫做子类 class People(Student): t = '' def __init__(self, n, a, w, t): self.t = t #定义父类的构造函数 Student.__init__(self, n, a, w) def know(self): print("%s say: I’m %d years old and %d cm。" % (self.n, self.a, self.t)) my = People('王二', 18 , 55,175) my.know() #调用定义方法
运行结果:
王二 say: I’m 18 years old and 175 cm。
上面的例子中包含了成员继承和方法重写,成员继承是指子类继承了父类除构造方法之外的所有成员。方法重写是指子类重新定义父类中的方法,这样就会覆盖父类的方法。
多重继承
python 支持多继承,如果父类中有相同名字的方法,在子类没有指定父类名时,python从左至右搜索。
class Aa: def ab(self): print(1234567) class Bb: def ab(self): print(7654321) class Cc(Bb, Aa): def cc(self): print('嗯哼') class Dd(Aa, Bb): def dd(self): print('嗯哼') c = Cc() c.ab() d = Dd() d.ab()
输出结果:
7654321
1234567
从结果我们可以知道执行了Bb类中的方法,因为父类中方法相同且没有指定父类,从左到右,会先去执行最左面类中的方法。
三、多态
1. 多态是方法的多态,属性没有多态。
2. 多态的存在有2 个必要条件:继承、方法重写。
class Name: def say(self): print(" I will introduce myself") class Mary(Name): def say(self): print("I'm Mary") class Bob(Name): def say(self): print("My name is Bob") def say_name(a): if isinstance(a,Name): a.say() #传入的对象不同,shout方法对应的实际行为也不同。 say_name(Mary()) say_name(Bob())
输出结果:
I'm Mary
My name is Bob
这里用到了isinstance函数,简单介绍一下。Isinstance属于python的内置函数,它是用来判断一个对象是否是一个已知的类型。
isinstance(object, classinfo)
object -- 实例对象。
classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。
在isinstance(a,Name)中,a代表实例对象。Name表示类名。
四、运算符重载
让自定义的类生成的对象(实例)能够使用运算符进行操作
格式:
def __xx__(self,other):
语句块
class V: def __init__(self, a, b): self.a = a self.b = b def __str__(self): return 'V(%d, %d)' % (self.a, self.b) def __add__(self, other): return V(self.a + other.a, self.b + other.b) a1 = V(1, 3) a2 = V(1, -4) print(a1 + a2)
结果:
V(2, -1)