2020-10-28 15:48发布
封装(隐藏)、继承、多态。
封装 、继承 、多态
面向对象的三大特性是指:封装、继承和多态。
面向对象三大特征 1.封装:根据职责将属性和方法封装到一个抽象的类中 2.继承:实现代码的重用,相同的代码不需要重复的写 3.多态:以封装和继承为前提,不同的子类对象调用相同的方法,产生不同的执行结果
(1)对象唯一性。
(2)抽象性。
(3)继承性。
(4)多态性(多形性)
上节课讲过了封装,这里简单的复习下
1.含义封装是对全局作用域中其它区域隐藏多余信息的原则。2.实例如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。代码如下:
class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print('%s: %s' % (self.__name, self.__score))12345678
改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了。这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法:
实例变量.__name
实例变量.__score
get_name
get_score
class Student(object): #这里的代码和上面一样,定义两个私有属性__name和__score ... def get_name(self): return self.__name def get_score(self): return self.__score123456789
如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:
class Student(object): #代码同上 ... def set_score(self, score): self.__score = score123456
需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
__xxx__
private变量
__name__
__score__
_name
1.什么是继承我们不想把同一段代码写好几次,之前使用的函数避免了这种情况。但现在又有个更微妙的问题。如果已经有了一个类,又想建立一个非常类似的类,只是添加几个方法。比如有人类,我们又想在人类的基础上建立学生类、医生类,教师类。因为他们都具有共同的属性和方法,比如都有 姓名 、年龄 、性别 等共同属性,还有吃饭、睡觉等共同方法。我们就可以写一个人类作为父类,包括姓名、年龄、性别等属性和吃饭睡觉等方法。然后再写多个子类继承父类的这些属性和方法。但需要注意的是,父类的私有属性和方法不会被子类继承话不多说,直接上代码:
但需要注意的是,父类的私有属性和方法不会被子类继承
#父类class Person(): def __init__(self,name=None,age=None,sex=None): self.name=name self.age=age self.sex=sex def eat(self): print("%s正在吃饭"%self.name)#学生子类:继承人类父类的属性class Student(Person): #子类的初始化参数要和父类的一样,否则没有办法给父类传参,会报错 def __init__(self,name=None,age=None,sex=None,score=None): # self.name=name # self.age=age # self.sex=sex #上面三行的代码等价于下面一行的代码,都是给父类的属性传参 Person.__init__(self,name,age,sex) #还可以这样写 #super().__init__(name,age,sex) self.score=score #这个可以是子类独有的方法,不会影响到父类 def study(self): self.eat() print("%s在学习,考了%d分"%(self.name,self.score)) #实例化一个学生对象,然后可以调用子类的方法,也可以直接调用父类的方法 stu=Student("汤姆",20,"男",80) stu.study()12345678910111213141516171819202122232425262728
以上代码运行结果为:汤姆正在吃饭汤姆在学习,考了80分
汤姆正在吃饭汤姆在学习,考了80分
2.有了继承,我们可以实现子类对父类方法的重写子类继承父类时,子类的方法签名和父类一样,此时子类重写了父类的方法,当生成子类对象时,调用的是子类重写的方法。下面上代码:
#父类class Person(): def __init__(self,name=None,age=None,sex=None): self.name=name self.age=age self.sex=sex def eat(self): print("%s正在吃饭"%self.name)#学生子类:继承人类父类的属性class Student(Person): def __init__(self,name=None,age=None,sex=None,score=None): # self.name=name # self.age=age # self.sex=sex #Person.__init__(self,name,age,sex) super().__init__(name,age,sex) self.score=score def study(self): self.eat() print("%s在学习,考了%d分"%(self.name,self.score)) #方法的重写,调用的时候调用子类的方法 #可以对自定义的方法进行重写 def eat(self): print("%d的%s正在吃饭,他是%s的"%(self.age,self.name,self.sex)) #也可以对自带的object类的方法进行重写。 def __str__(self): return "姓名:{0},年龄:{1},性别:{2},成绩:{3}".format(self.name,self.age,self.sex,self.score) def __lt__(self,other): """ if isinstance(other,Student): return self.age以上代码输出为:20的汤姆正在吃饭,他是男的汤姆在学习,考了80分20的汤姆正在吃饭,他是男的姓名:汤姆,年龄:20,性别:男,成绩:80姓名:杰克,年龄:20,性别:男,成绩:90姓名:杰森,年龄:21,性别:男,成绩:20姓名:杰森,年龄:12,性别:女,成绩:50姓名:杰克,年龄:20,性别:男,成绩:90姓名:杰森,年龄:12,性别:女,成绩:50姓名:杰森,年龄:21,性别:男,成绩:20姓名:汤姆,年龄:20,性别:男,成绩:80如上,我们对自定义的eat()方法进行了重写,也对3.多继承一个类可以继承多个父类。class A: def __init__(self,a=None): self.a=a def test(self): print("A...test")class B: def __init__(self,b=None): self.b=b def test(self): print("B...test")class C(B,A): def __init__(self,a): A.__init__(self,a) def t(self): A.test(self)#调用A的test() super().test()#这个调用的也是B的test print("C....t") c=C("aa")#默认调用的是父类B的test方法,因为在class C(B,A),B在A前面c.test() c.t()123456789101112131415161718192021以上实例输出结果为:B...testA...testB...testC....tclass C(B,A),当有AB均有相同方法,而子类又重写时,调用子类的方法,如果子类没有方法,则调用在继承时写在前面的父类的方法(这里也就是B)。三.多态1.什么是多态?当子类和父类都存在相同的方法时,我们说,子类的方法覆盖了父类的方法,在代码运行的时候,总是会调用子类的方法。这样,我们就获得了继承的另一个好处:多态。2.多态的实例简单工厂模式就是典型的多态体现:让用户输入要选择的汉堡,他不需要知道内部是如何制作的,只要得到一个选择的汉堡实例对象就可以#创建汉堡的父类,并根据父类创建几个子类class Hamburger: def make(self): print("您没有正确选择要制作的汉堡,请重新输入")class FishHamburger(Hamburger): def make(self): print("您的鱼肉汉堡已经制作好了")class BeafHamburger(Hamburger): def make(self): print("您的牛肉汉堡已经制作好了")class ChickenHamburger(Hamburger): def make(self): print("您的鸡肉汉堡已经制作好了")#工厂类,用来判断用户输入的值并创建相应的对象class HamburgerFactory: @classmethod def getinput(cls,temp): if temp=="1": ch=FishHamburger() elif temp=="2": ch=BeafHamburger() elif temp=="3": ch=ChickenHamburger() else: ch=Hamburger() return ch#主方法,通过用户输入的值调用工厂的类方法while True: temp=input("请输入您要制作汉堡的序号,1.鱼肉汉堡,2.牛肉汉堡,3.鸡肉汉堡") if temp=="1" or temp=="2" or temp=="3": ch=HamburgerFactory.getinput(temp) ch.make() break else: ch=Hamburger() ch.make() continue
以上代码输出为:20的汤姆正在吃饭,他是男的汤姆在学习,考了80分20的汤姆正在吃饭,他是男的姓名:汤姆,年龄:20,性别:男,成绩:80姓名:杰克,年龄:20,性别:男,成绩:90姓名:杰森,年龄:21,性别:男,成绩:20姓名:杰森,年龄:12,性别:女,成绩:50姓名:杰克,年龄:20,性别:男,成绩:90姓名:杰森,年龄:12,性别:女,成绩:50姓名:杰森,年龄:21,性别:男,成绩:20姓名:汤姆,年龄:20,性别:男,成绩:80如上,我们对自定义的eat()方法进行了重写,也对
20的汤姆正在吃饭,他是男的汤姆在学习,考了80分20的汤姆正在吃饭,他是男的姓名:汤姆,年龄:20,性别:男,成绩:80姓名:杰克,年龄:20,性别:男,成绩:90姓名:杰森,年龄:21,性别:男,成绩:20姓名:杰森,年龄:12,性别:女,成绩:50姓名:杰克,年龄:20,性别:男,成绩:90姓名:杰森,年龄:12,性别:女,成绩:50姓名:杰森,年龄:21,性别:男,成绩:20姓名:汤姆,年龄:20,性别:男,成绩:80
eat()
3.多继承一个类可以继承多个父类。
class A: def __init__(self,a=None): self.a=a def test(self): print("A...test")class B: def __init__(self,b=None): self.b=b def test(self): print("B...test")class C(B,A): def __init__(self,a): A.__init__(self,a) def t(self): A.test(self)#调用A的test() super().test()#这个调用的也是B的test print("C....t") c=C("aa")#默认调用的是父类B的test方法,因为在class C(B,A),B在A前面c.test() c.t()123456789101112131415161718192021
以上实例输出结果为:B...testA...testB...testC....tclass C(B,A),当有AB均有相同方法,而子类又重写时,调用子类的方法,如果子类没有方法,则调用在继承时写在前面的父类的方法(这里也就是B)。
B...testA...testB...testC....t
1.什么是多态?当子类和父类都存在相同的方法时,我们说,子类的方法覆盖了父类的方法,在代码运行的时候,总是会调用子类的方法。这样,我们就获得了继承的另一个好处:多态。2.多态的实例简单工厂模式就是典型的多态体现:
简单工厂模式
让用户输入要选择的汉堡,他不需要知道内部是如何制作的,只要得到一个选择的汉堡实例对象就可以
#创建汉堡的父类,并根据父类创建几个子类class Hamburger: def make(self): print("您没有正确选择要制作的汉堡,请重新输入")class FishHamburger(Hamburger): def make(self): print("您的鱼肉汉堡已经制作好了")class BeafHamburger(Hamburger): def make(self): print("您的牛肉汉堡已经制作好了")class ChickenHamburger(Hamburger): def make(self): print("您的鸡肉汉堡已经制作好了")#工厂类,用来判断用户输入的值并创建相应的对象class HamburgerFactory: @classmethod def getinput(cls,temp): if temp=="1": ch=FishHamburger() elif temp=="2": ch=BeafHamburger() elif temp=="3": ch=ChickenHamburger() else: ch=Hamburger() return ch#主方法,通过用户输入的值调用工厂的类方法while True: temp=input("请输入您要制作汉堡的序号,1.鱼肉汉堡,2.牛肉汉堡,3.鸡肉汉堡") if temp=="1" or temp=="2" or temp=="3": ch=HamburgerFactory.getinput(temp) ch.make() break else: ch=Hamburger() ch.make() continue
可以试下在cmd命令行执行,编辑器中对turtle的支持度不是很好。
人工智能是一门起步晚却发展快速的科学。20 世纪以来科学工作者们不断寻求着赋予机器人类智慧的方法。现代人工智能这一概念是从英国科学家图灵的寻求智能机发展而来,直到1937年图灵发表的论文《理想自动机》给人工智能下了严格的数学定义,现实世界中实际要...
代理ip网址http://www.goubanjia.com/http://www.ip181.com/https://www.kuaidaili.com/python 环境安装requests库安装bs4库proxies设置代理服务器地址proxies = {'http': 'http://61.155.164.110:3128'}http://www.goub......
要求:用户正确输入用户名和密码便成功登陆,分别有三次机会输入用户名和密码,超过3次便锁定分析:用两个while循环即可,代码如下:user_name = Brettpassword = 1314i = 0n = 0Is_exit = False #进入循环标志while not Is_exit:User_name = input(please ...
MacOS设置环境变量path的完全总结 一、MacOS加载bash shell 环境变量的加载顺序 mac 一般使用bash作为默认shell,Mac系统的环境变量,加载顺序为:1、系统级别的/etc/profile ...
当你运行代码的时候,需要你指定闹钟的时间,然后闹钟就会在指定的时间想起来。电脑pytho加载time模块,获取此时此刻的时间:import timet = time.localtime()print(t)时间是以字典的形式出现的。从字典里面提取时间信息:now = time.strftime(%H %M, t).spli...
在几千条数据中有正负数,筛选出同一供应商下正负数相加为零的数据,正负数相加有可能为一正一负相加为零,也有可能是一正多负,也有可能一负多正,总体是将可以所有正负数相加为零的数据标注颜色出来。excel论坛上说计算量太 ...可以用pandas来处理...
import sqlite3p = sqlite3.connect(file:memDB1?mode=memory&cache=shared, uri=True)p.execute('CREATE TABLE tbTest (fld1, fld2)')p.execute(INSERT INTO tbTest VALUES ('fld1', 'fld2'...
Python虽然是解释型语言,但从设计之初就已经是一门面向对象的语言,对于Python来说一切皆为对象。正因为如此,在Python中创建一个类和对象是很容易的,当然如果习惯面向过程或者函数的写法也是可以的,Python并不做硬性的限制。...
什么是任务 一个电脑运行这的软件 什么是多任务 电脑同时运行着的多个软件 多任务原理 时间片的轮转 并行与并发 并发:假的多任务,多个任务共用一个核 ...
Try...except... 假如,我们已经知道这种类型的错误,那么就可以通过一个异常扑捉来扑捉这个错误。我们可以通过try...except 来接收这个错误。打开文件写入:try: open(abc.txt,'r')except IOError: pass再来运行程序就会看不到任...
Python用异常对象 (exception object)来表示异常情况。遇到错误后,会引发异常。如果异常对象并未被处理或捕捉,程序就会用所谓的 回溯 (traceback, 一种错误信息)终止执行。
1.try…except…结构在Python异常处理结构中try…except…结构使用最为频繁,其中try子句中代码块为可能引发异常的语句,except子句用来捕获相应的异常。也可以解释为,当try子句代码块执行异常并且被except子句捕获,则执行except子句的代码块2.try…excep…...
面向对象和面向过程的区别:a.面向过程: 1)根据业务逻辑从上到下写代码 2)开发思路是将数据和函数按照执行的逻辑顺序组织在一起 3)分开考虑数据与函数 定义性文字: 面向对象编程(Object Oriented Programming-OOP) 是一种解决软件复用的...
NameVersionDescriptionPython3.3.3Python programming language with standard libraryPython 标准库astroid1.0.1Rebuild a new abstract syntax tree from Python's ast (required for pylint)colorama0.2.7Cross...
java.lang.*java.util.*java.io.*java.net.*java.sql.*
最多设置5个标签!
封装(隐藏)、继承、多态。
封装 、继承 、多态
面向对象的三大特性是指:封装、继承和多态。
面向对象的三大特性是指:封装、继承和多态。
(1)对象唯一性。
(2)抽象性。
(3)继承性。
(4)多态性(多形性)
封装 、继承 、多态
封装 、 继承 、 多态
一.封装
上节课讲过了封装,这里简单的复习下
二.继承
1.什么是继承
我们不想把同一段代码写好几次,之前使用的函数避免了这种情况。但现在又有个更微妙的问题。如果已经有了一个类,又想建立一个非常类似的类,只是添加几个方法。
比如有人类,我们又想在人类的基础上建立学生类、医生类,教师类。因为他们都具有共同的属性和方法,比如都有 姓名 、年龄 、性别 等共同属性,还有吃饭、睡觉等共同方法。我们就可以写一个人类作为父类,包括姓名、年龄、性别等属性和吃饭睡觉等方法。然后再写多个子类继承父类的这些属性和方法。
但需要注意的是,父类的私有属性和方法不会被子类继承
话不多说,直接上代码:
2.有了继承,我们可以实现子类对父类方法的重写
子类继承父类时,子类的方法签名和父类一样,此时子类重写了父类的方法,当生成子类对象时,调用的是子类重写的方法。
下面上代码:
相关问题推荐
可以试下在cmd命令行执行,编辑器中对turtle的支持度不是很好。
人工智能是一门起步晚却发展快速的科学。20 世纪以来科学工作者们不断寻求着赋予机器人类智慧的方法。现代人工智能这一概念是从英国科学家图灵的寻求智能机发展而来,直到1937年图灵发表的论文《理想自动机》给人工智能下了严格的数学定义,现实世界中实际要...
代理ip网址http://www.goubanjia.com/http://www.ip181.com/https://www.kuaidaili.com/python 环境安装requests库安装bs4库proxies设置代理服务器地址proxies = {'http': 'http://61.155.164.110:3128'}http://www.goub......
要求:用户正确输入用户名和密码便成功登陆,分别有三次机会输入用户名和密码,超过3次便锁定分析:用两个while循环即可,代码如下:user_name = Brettpassword = 1314i = 0n = 0Is_exit = False #进入循环标志while not Is_exit:User_name = input(please ...
MacOS设置环境变量path的完全总结 一、MacOS加载bash shell 环境变量的加载顺序 mac 一般使用bash作为默认shell,Mac系统的环境变量,加载顺序为:1、系统级别的/etc/profile ...
当你运行代码的时候,需要你指定闹钟的时间,然后闹钟就会在指定的时间想起来。电脑pytho加载time模块,获取此时此刻的时间:import timet = time.localtime()print(t)时间是以字典的形式出现的。从字典里面提取时间信息:now = time.strftime(%H %M, t).spli...
在几千条数据中有正负数,筛选出同一供应商下正负数相加为零的数据,正负数相加有可能为一正一负相加为零,也有可能是一正多负,也有可能一负多正,总体是将可以所有正负数相加为零的数据标注颜色出来。excel论坛上说计算量太 ...可以用pandas来处理...
import sqlite3p = sqlite3.connect(file:memDB1?mode=memory&cache=shared, uri=True)p.execute('CREATE TABLE tbTest (fld1, fld2)')p.execute(INSERT INTO tbTest VALUES ('fld1', 'fld2'...
Python虽然是解释型语言,但从设计之初就已经是一门面向对象的语言,对于Python来说一切皆为对象。正因为如此,在Python中创建一个类和对象是很容易的,当然如果习惯面向过程或者函数的写法也是可以的,Python并不做硬性的限制。...
什么是任务 一个电脑运行这的软件 什么是多任务 电脑同时运行着的多个软件 多任务原理 时间片的轮转 并行与并发 并发:假的多任务,多个任务共用一个核 ...
Try...except... 假如,我们已经知道这种类型的错误,那么就可以通过一个异常扑捉来扑捉这个错误。我们可以通过try...except 来接收这个错误。打开文件写入:try: open(abc.txt,'r')except IOError: pass再来运行程序就会看不到任...
Python用异常对象 (exception object)来表示异常情况。遇到错误后,会引发异常。如果异常对象并未被处理或捕捉,程序就会用所谓的 回溯 (traceback, 一种错误信息)终止执行。
1.try…except…结构在Python异常处理结构中try…except…结构使用最为频繁,其中try子句中代码块为可能引发异常的语句,except子句用来捕获相应的异常。也可以解释为,当try子句代码块执行异常并且被except子句捕获,则执行except子句的代码块2.try…excep…...
面向对象和面向过程的区别:a.面向过程: 1)根据业务逻辑从上到下写代码 2)开发思路是将数据和函数按照执行的逻辑顺序组织在一起 3)分开考虑数据与函数 定义性文字: 面向对象编程(Object Oriented Programming-OOP) 是一种解决软件复用的...
NameVersionDescriptionPython3.3.3Python programming language with standard libraryPython 标准库astroid1.0.1Rebuild a new abstract syntax tree from Python's ast (required for pylint)colorama0.2.7Cross...
java.lang.*java.util.*java.io.*java.net.*java.sql.*