面向对象编程的特征
封装:增加安全性
将数据和方法封装在类对象内,通过实例对象进行调用。
在Python中私有变量的定义方法为在前面加两个下划线。
下面举个栗子,也补充一个可以调用私有对象的方法:
# 项目名:pythonProject2
# NAME:demo22
# 开发时间:2021/4/16 18:33
class Student :
def __init__(self,name,age):
self.name = name
self.__age = age #age为私有变量
return
def show(self):
print(self.name,self.__age)
return
stu1 = Student('szj',24)
stu1.show()
# print(stu1.name,stu1.__age) #age作为私有变量不能在类外被使用,会报错
print(dir(stu1)) #查看stu1中所有的方法以及变量
print(stu1._Student__age) #通过这种方式可以调用私有变量
继承:提高代码的复用性
语法格式:
class 子类名 (父类1,父类2,…)
pass
特征:
1.如果一个类没有继承任何类,则默认继承object
2.Python支持多继承(一个子类可以继承多个父类)
3.定义子类时,必须在其构造函数(即初始化函数__init__)中调用父类的构造函数
举个栗子:
# 项目名:pythonProject2
# NAME:demo23
# 开发时间:2021/4/16 18:59
class Person(object) : #默认即为object
def __init__(self,name,age):
self.name = name
self.age = age
return
def info(self):
print(self.name,self.age)
return
#定义子类Student继承Person
class Student (Person) :
def __init__(self,name,age,score):
super().__init__(name,age) #调用父类的初始化方法将name和age传入子类
self.score = score
return
class Teacher (Person) :
def __init__(self,name,age,teaching_age):
super().__init__(name,age)
self.teaching_age = teaching_age
return
stu1 = Student('szj',24,89)
tch1 = Teacher('lch',3,10)
stu1.info()
tch1.info()
****方法重写****
说到方法继承那就接着说方法重写,如果子类对继承父类的某个属性或方法不满意,对其进行重写。重写后的方法可以通过super().xxx()调用父类中被重写的方法。
# 项目名:pythonProject2
# NAME:demo23
# 开发时间:2021/4/16 18:59
class Person(object) : #默认即为object
def __init__(self,name,age):
self.name = name
self.age = age
return
def info(self):
print(self.name,self.age)
return
#定义子类Student继承Person
class Student (Person) :
def __init__(self,name,age,score):
super().__init__(name,age) #调用父类的初始化方法将name和age传入子类
self.score = score
return
def info(self):
super().info()
print(self.score)
class Teacher (Person) :
def __init__(self,name,age,teaching_age):
super().__init__(name,age)
self.teaching_age = teaching_age
return
stu1 = Student('szj',24,89)
tch1 = Teacher('lch',3,10)
stu1.info()
tch1.info()
stu1.info()
这里的stu1.info()就是Student类将Person类中的info()方法重写之后的输出结果。其实最直观的我们可以看到,在创建子类的时候,子类的初始化方法就是对父类初始化方法的重写,这也是最好的重写的例子。
Obeject类
object类是所有类的父类,其内置函数dir()可以查看指定对象所有的属性。在编写的类中可以对object类中的方法进行重写。
下面进行一下对比:
# 项目名:pythonProject2
# NAME:demo24
# 开发时间:2021/4/17 20:22
class Student:
def __init__(self,name,age,gradeid):
self.name = name
self.age = age
self.gradeid = gradeid
stu = Student('szj',24,4)
print(dir(stu))
print(stu)
结果为:
我重写了object类的str方法:
# 项目名:pythonProject2
# NAME:demo24
# 开发时间:2021/4/17 20:22
class Student:
def __init__(self,name,age,gradeid):
self.name = name
self.age = age
self.gradeid = gradeid
return
#重写object类的str方法
def __str__(self):
return '学生名字为%s,年龄%d岁,就读大学%d年级'%(self.name,self.age,self.gradeid)
stu = Student('szj',24,4)
print(dir(stu))
print(stu)
输出结果为:
str方法就是将实例对象的信息进行输出,通常更改后可以输出初始化的信息,这样子更加直观。当然这里也是对前面重写的复习了。
多态:提高程序的可扩展性和可维护性
# 项目名:pythonProject2
# NAME:demo25
# 开发时间:2021/4/18 17:27
#多态
class Animal():
def eat(self):
print('animal eat')
return
#定义Dog类继承Animal类并重写eat方法
class Dog(Animal):
def eat(self):
print('dog eat')
return
#定义Cat类继承Animal类并重写eat方法,并在其中调用父类的eat方法
class Cat(Animal):
def eat(self):
super().eat()
print('cat eat')
return
#People类不继承Animal类,但也有eat方法
class People():
def eat(self):
print('people eat')
return
#定义fun()函数,需要传入Animal类参数
def fun(Animal):
Animal.eat()
return
cat = Cat()
dog = Dog()
person = People()
animal = Animal()
fun(cat) #输出两次,因为重写过程中也调用了父类的方法
fun(dog)
fun(person)
fun(animal)
虽然在fun()函数定义的时候规定了传入的参数需要是Animal类,但是因为Dog类和Cat类都是Animal类的子类,所以也可以传入,而People类由于也定义eat()方法,所以也可以作为参数传入fun()函数中。