一、封装是使用私有属性时会用到
1.封装理解
1.1语法角度:把对象的属性设置为私有属性,再编写两个方法,get方法获取私有属性的值,set方法设置私有属性的值
1.2应用角度:封装隔离了代码的复杂度;封装提高了属性的安全性
2.私有属性不能在类外部使用
class People:
def __init__(self,name,age,money):
self.name=name
self.age=age
self.__money = money#属性中带有两个下划线开头的是私有属性,不能在类的外部使用
def get_money(self):#封装一半get方法获取私有属性的值
return self.__money
def set_money(self,money):#封装的另一半set方法设置私有属性的值
self.__money=money
#创建对象
lss=People('小熊',18,200)
#私有属性不能在类外部使用
# print(lss.__money)#会报错因为不能在外部使用私有属性
print(lss.get_money())#不会报错
lss.set_money(lss.get_money()-100)
print(lss.get_money())
#4.2操作私有属性的特殊实现---在外部直接访问私有属性
#对象名._类名__私有属性名----->访问私有属性
print(lss._People__money)
?二、继承(减少代码冗余,便于代码维护)
1.判断是否继承的函数有两个
(1)isinstance(对象名或者子类对象名, 类名) 用于检查实例类型
(2)issubclass(子类名, 父类名) 用于检查类继承
可以通过循环或者三元运算符使用上面两种函数
#python中条件非0,非空(比如说列表里面有值,字符串里面有值等等),逻辑运算结果为真
1.isinstance函数
if isinstance(10.5, float):
print('10.5是浮点型')
else:
print('10.5不是浮点型')
2.issubclass函数
if issubclass(tuple,list):
print('tuple是list的子类')
else:
print('tuple不是list的子类')
#三元运算符---->如果判断成立,就输出value值
value='浮点型' if isinstance(10.5,float) else '不是浮点型'
print(value)
2.查看子类的父类(显示父类)------>子类名.__bases__
#示例:
class People06:
def __init__(self,name):
self.name=name
class Students(People06):
pass
class CollegeStudent(Students):
pass
#object默认是所有父类,python3语法,默认继承了object
print(People06.__bases__)
#显示父类---> 子类名.__bases__
print(Students.__bases__)
print(CollegeStudent.__bases__)
xiaoxiao=CollegeStudent('小小')
#判断子类是否属于某个父类或者判断数据类型----对象名,类名-----正确是True,不正确就是False
print(isinstance(xiaoxiao, People06))
print(isinstance(1, int))
#判断父子类关系---子类名,父类名-------正确是True,不正确就是False
print(issubclass(CollegeStudent, People06))
结果:
?
?
?
继承特点一:
在Python中,如果父类和子类都重新定义了构造方法__init__( ),在进行子类实例化的时候,子类的构造方法不会自动调用父类的构造方法,必须在子类中显示调用
继承特点二:
如果需要在子类中调用父类的方法:需要以 父类名.方法 这种方式调用, 以这种方式调用的时候,注意要传递self参数过去;另一种方法是使用super() ,直接使用super().xxx(实参) 或super(子类, self ).xxx(实参)
继承特点三:
Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)
继承特点四:
对于继承关系,子类继承了父类所有的公有属性和方法,但是不能继承私有的属性和方法
继承特点五:
java不支持多继承,一个子类只能有一个父类,Python支持多继承,能够让一个子类有多个父类。如果有多个父类,多个父类名之间用逗号隔开。
语法:
class 子类(父类1,父类2......)
python一般以第一个父类为主父类,优先级最高
1.如果 子类 没有重新定义构造方法,它会自动调用第一个 父类 的构造方法,以第一个 父类 为中心。如果父类1与父类2有同名方法则调用第一个
2.如果 子类 重新定义了构造方法,需要显示去调用父类的构造方法,此时调用哪个父类的构造方法由你自己决定;
语法:
想调用的父类名.__init__(self,实参列表)
class People04:
def __init__(self,name,age):
self.name=name
self.age=age
def say(self,content):
print('%s说了%s'%(self.name,content))
class Teacher(People04):#继承括号里面的父类
def __init__(self,name,age,type):
#调用父类方法一:父类名.方法名----这种方式在调用的时候需要传递self参数过去
People04.__init__(self,name,age)#调用父类的构造方法
#调用父类方法二:super().__init__(父类属性列表)
# super().__init__(name,age)
# #调用父类方法三:super(子类名,self).__init__(父类属性列表)------#super()--->代表父类
# super(Teacher,self).__init__(name,age)
self.type=type
def teach(self,content):
print('%s教了%s'%(self.name,content))
class Student(People04):
def __init__(self,name,age,grade):
People04.__init__(self,name,age)
self.grade=grade
def study(self,content):
print('%s学了%s'%(self.name,content))
xiaobai=People04('小白',17)
xiaohei=Teacher('小黑',25,'高中生物')
xiaoming=Student('小明',7,'一年级')
# print(xiaohei.name)
# xiaohei.say('xxxxxxx')
继承特点三示例:
class A1:
def pri(self):
print('A1')
class A2(A1):
def pri(self):
print('A2')
class A3(A2):
pass
aa=A3()
aa.pri()
#先执行子类方法,如果子类没有方法会执行父类,一直找下去----->先找A3有无pri方法,无就找父类A2,如果A2无继续找A1
继承特点五示例:
class Doctor:
def __init__(self,name,type):
self.d_name = name
self.d_type = type
class Consultant:
def __init__(self,name,type):
self.c_name = name
self.c_type = type
class MedicalConsultant(Doctor,Consultant):#继承多个父类
def __init__(self):
pass
三、多态(指具有不同功能函数可以使用相同的函数名,这样就可以用一个函数调用不同内容的函数)
'''
多态示例 1.
'''
from abc import ABCMeta,abstractmethod
class File(metaclass=ABCMeta):
def __init__(self,name):
self.name=name
@abstractmethod
def double_click(self):
pass
class TxtFile(File):
def double_click(self):
print('双击【%s】查看内容'%self.name)
class Mp3File(File):
def double_click(self):
print('打开QQ音乐播放【%s】'%self.name)
class VideoFile(File):
def double_click(self):
print('打开爱奇艺播放【%s】'%self.name)
class ExeFile(File):
def double_click(self):
print('运行可执行文件【%s】'%self.name)
#file_b=obj 形参----这个方法具有多态性
def double_click(file_bobj):
file_bobj.double_click()
video=VideoFile('云南虫谷');double_click(video)
mp3=Mp3File('我和我的祖国');double_click(mp3)
txt=TxtFile('数学笔记');double_click(txt)
exe=ExeFile('QQ.exe');double_click(exe)
结果:
?
'''
多态示例 2.
创建一个游客visitor类,包含(姓名、年龄、性别)、检票方法为抽象方法,再创建3个子类 成年游客Adult_visitors、少年游客young_visitors、婴儿游客baby_visitors,
都实现检票方法 ;再创建一个检票方法,具有多态性,即传不同的游客子类进来,进行不同的票价处理
'''
class Visitor(metaclass=ABCMeta):
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex=sex
@abstractmethod
def method(self):
pass
class Adult_visitors(Visitor):
def method(self):
print('成年游客[%s]票价为:138'%self.name)
class Young_visitors(Visitor):
def method(self):
print('少年游客[%s]票价为:108'%self.name)
class Baby_visitors(Visitor):
def method(self):
print('婴儿游客[%s]票价为:免费'%self.name)
def method(visitor):
visitor.method()
visitor1=Adult_visitors('啦啦','45','男');method(visitor1) visitor2=Young_visitors('乐乐','15','男');method(visitor2)
visitor3=Baby_visitors('思思','2个月','女');method(visitor3)
|