IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python封装、继承、多态 -> 正文阅读

[Python知识库]python封装、继承、多态

一、封装是使用私有属性时会用到

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)
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-05 10:46:11  更:2021-09-05 10:46:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 13:38:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码