集团主站
欢迎来到成都达内官方网站!达内—美国上市公司 亿元级外企IT培训企业!
成都it培训哪家好
成都it培训哪家好
全国服务监督电话:400-111-8989  |   联系客服   |
当前位置:主页 > 培训课程 > Python >

成都python培训班:封装、继承和多态

发布者: 成都达内     浏览次数:     发布时间:2021-04-14 10:50:53

成都python培训班:封装-封装就是隐藏底层的实现细节,只提供公有的接口供外界访问, 这样当底层实现细节改变的时候,就不会对外界造成影响。...

  1|0封装

  1|1封装性

  封装就是隐藏底层的实现细节,只提供公有的接口供外界访问, 这样当底层实现细节改变的时候,就不会对外界造成影响。

  1|2私有属性

  在类的设计角度,我们可以将属性或方法(类的成员)定义为私有,来实现封装。

  私有成员只能在定义类的内部进行访问,在类外是无法进行访问的。

  私有成员的定义方式:以_进行开头,但是不能以两个或多个进行结尾。

  class Computer:

  def __init__(self,cpu):

  self.cpu = cpu

  # 私有属性(私有的实例属性)

  self.__memory = 1024

  # 在定义私有属性“类的内部”,可以访问私有成员

  #print(self.__memory)

  c = Computer("某cpu")

  c.__memory # 可以发现私有属性不能够在外部直接访问

  结果如下:

  成都python培训班:封装、继承和多态

  class Computer:

  def __init__(self,cpu):

  self.cpu = cpu

  # 私有属性(私有的实例属性)

  self.__memory = 1024

  # 在定义私有属性“类的内部”,可以访问私有成员

  print(self.__memory)

  def x(self):

  pass

  # 如果想要采用公有的方法(在类的外部),访问私有属性。需要额外定义两个方法

  def set_memory(self,memory):

  self.__memory = memory

  def get_memory(self):

  return self.__memory

  c = Computer("某cpu")

  c.get_memory()

  结果如下:

  成都python培训班:封装、继承和多态

  为什么非要定义为:私有属性呢?定义为一般的实例属性不是也可以吗?

  原因在于:定义为私有属性后。当我们以后需要对类中某属性做出修改时,只需要在内部修改,而不会对外部的使用者,产生影响。

  假如不将memory定义为私有属性

  class Computer:

  def __init__(self, cpu):

  self.cpu = cpu

  self.memory = 1024

  c = Computer("某cpu")

  print(c.memory)

  # 1024

  c.memory = 6666

  print(c.memory)

  # 6666

  成都python培训班:封装、继承和多态

  假如说,由于某种业务要求,需要将memory改为memory2,那么,我们不仅需要在内部进行修改。同时外部调用者也需要进行修改。假如你有很多粉丝使用这个,估计都会骂你(假如代码中有很多行都需要将memory改为memory2)

  其实,私有属性也并非真正的私有。只是将名称进行了一下伪装而已。

  伪装成了:类名_私有属性的名称

  这就意味着,在类的外部,我们可以通过真实名称对私有属性进行访问。

  但是,不建议这么做。伪装就是为了保证封装性,而你非要去捅破。

  class Computer:

  def __init__(self,cpu):

  self.cpu = cpu

  self.__memory = 1024

  c = Computer("某cpu")

  c.__memory

  c._Computer__memory # 切记不要这么做。这样做破坏了封装性

  结果如下:

  成都python培训班:封装、继承和多态

  2|0继承

  2|1继承之前

  class PythonTeacher:

  def __init__(self,name,group):

  self.name = name

  self.group = group

  def introcude(self):

  print(f"我的名字是{self.name},所在小组是{self.group}")

  def teach(self):

  print("打开pycharm")

  print("输入代码")

  print("知识点讲解")

  class JaVaTeacher:

  def __init__(self,name,group):

  self.name = name

  self.group = group

  def introcude(self):

  print(f"我的名字是{self.name},所在小组是{self.group}")

  def teach(self):

  print("打开eslipse")

  print("输入代码")

  print("知识点讲解")

  2|2实现继承

  继承体现的是一般与特殊的关系。如果两个类A与B,A(苹果)是一种特殊的B(水果),则我们就称A继承了B,A就是子类,B就是父类。

  子类一旦继承了父类,子类就会成为一种特殊的父类,子类就会具备父类的一切特征。因此,父类能够做的事情,子类也可以做到。

  子类继承了父类,子类就会继承父类中定义的成员,就好象子类中自己定义了一样。

  class Fruit:

  def show(self):

  print("水果")

  # 继承,在定义类时,给出继承的父类

  class Apple(Fruit):

  pass

  f = Fruit()

  f.show()

  a = Apple()

  a.show()

  结果如下:

  成都python培训班:封装、继承和多态

  定义类时,若没有显示的继承任何类,则表明继承object类,object是python中最根层次的类。

  我们可以将公共的功能提取出来,放入父类中。然后使用每一个子类去继承父类。这样,就无需将这些公共的功能分别放在子类中实现。从而避免了代码的重复性。

  子类继承父类,子类可以吸收“父类的功能”,此外,子类还可以增加自己特有的功能。如果父类的功能对于子类来说不适用,子类就可以改造(重写)父类中的功能。

  class Bird:

  def fly(self):

  print("鸟飞")

  def describe(self):

  print("有羽毛,无牙齿,蛋生")

  class Ostrich(Bird):

  # 父类中的fly功能,不适合鸵鸟。因此,子类需要对父类的功能进行修改

  def fly(self):

  print("不会飞")

  # 子类增加自己特有的功能

  def run(self):

  print("高速奔跑")

  c = Ostrich()

  c.fly(),c.describe(),c.run()

  结果如下:

  成都python培训班:封装、继承和多态

  2|3成员继承

  子类可以继承父类中定义的:类属性、实例属性;类方法、实例方法;静态方法。

  class Father:

  class_attr = 1

  def __init__(self):

  self.instance_attr = 2

  def instance_method(self):

  pass

  @classmethod

  def class_method(cls):

  pass

  @staticmethod

  def static_method():

  pass

  class Son(Father):

  pass

  s = Son()

  然后子类就可以调用父类的类属性、实例属性;类方法、实例方法;静态方法。

  成都python培训班:封装、继承和多态

  对于父类中的实例属性,我们需要留意。如果子类中定义了自己的init方法,则不会调用父类的init方法。因此,父类方法中绑定的实例属性,就不会绑定到子类对象上,也就是说父类的实力属性,子类不会得到继承。

  class Father:

  class_attr = 1

  def __init__(self):

  self.instance_attr = 2

  def instance_method(self):

  pass

  @classmethod

  def class_method(cls):

  pass

  @staticmethod

  def static_method():

  pass

  class Son(Father):

  def __init__(self):

  pass

  so = Son()

  so.instance_attr

  结果如下:

  成都python培训班:封装、继承和多态

  有时候,父类的初始化,可能"并不完全适合于"子类。这是,子类需要定义自己的init方法。

  "并不完全适合于"指的是:父类中,有的实例属性适合雨子类,有的不适合于子类。子类中既要定义自己的init方法,又想使用父类中部分实例属性,那么该怎么做呢?

  class Person():

  delf __init__(self,name,age):

  self.name = name

  self.age = age

  class Student(Person):

  delf __init__(self,name,age,id):

  self.name = name

  self.age = age

  self.id = id

  # 父类的初始化不完全适合于子类,但是,也没有完全不适合于子类

  整改:在子类的init方法中,去调用父类的init方法,这样可以"避免代码重复"。

  2|4super()方法登场

  class Person():

  def __init__(self,name,age):

  self.name = name

  self.age = age

  class Student(Person):

  def __init__(self,name,age,id):

  # 调用父类的__init__方法

  super().__init__(name,age) # 调用父类的__init__方法

  self.id = id

  s = Student("梁某人",18,2017011)

  s.name,s.age,s.id

  结果如下:

  成都python培训班:封装、继承和多态

  2|5私有属性的继承

  实际上,私有属性也是可以被子类继承的。只不过,子类继承的不是私有属性本来的名字,而是私有属性伪装后的名字。

  虽然子类可以继承并访问父类的私有属性,但是不建议这么做。既然是私有的,肯定是不愿意我们去访问的。

  class Father:

  def __m(self):

  print("私有方法")

  class Son(Father):

  def p(self):

  # 通过伪装之后的名字,进行访问

  self._Father__m()

  s = Son()

  s.p()

  结果如下:

  成都python培训班:封装、继承和多态

  2|6两个关于继承的内建函数

  ① isinstance(参数一,参数二)

  第一个参数:对象;

  第二个参数:类型;

  含义:判断第一个指定的参数指定的"对象",是否是第二个参数的指定类型(包括其父类性);

  class Father:

  pass

  class Son(Father):

  pass

  f = Father()

  s = Son()

  来检测一下:

  成都python培训班:封装、继承和多态

  ② issubclass()

  第一个参数:类型;

  第二个参数:类型;

  含义:判断第一个指定的参数类型,是否是第二个参数的指定类型(或者是其子类型);

  class Father:

  pass

  class Son(Father):

  pass

  f = Father()

  s = Son()

  再来检测一下:

  成都python培训班:封装、继承和多态

  2|7重写

  当父类中的成员,对子类不完全适用时,子类就可以重新定义该成员。

  class Bird:

  def fly(self):

  print("鸟飞")

  class Ostrich(Bird):

  # 父类中的fly功能,不适合鸵鸟。因此,子类需要对父类的功能进行修改

  def fly(self):

  print("不会飞")

  # 子类增加自己特有的功能

  def run(self):

  print("高速奔跑")

  o = Ostrich()

  o.fly()

  结果如下:

  成都python培训班:封装、继承和多态

  class Bird:

  def fly(self):

  print("鸟飞")

  class Ostrich(Bird):

  # 父类中的fly功能,不适合鸵鸟。因此,子类需要对父类的功能进行修改

  def fly(self):

  # 通过super()方法,可以实现对父类中同名方法的访问

  super().fly() # super()既可以调用父类中的私有属性。也可以调用父类中的方法

  print("不会飞")

  o = Ostrich()

  o.fly()

  结果如下:

  成都python培训班:封装、继承和多态

  2|8多重继承

  python中,一个子类可以继承多个父类。多个父类的成员,都可以被子类所继承。继承多个父类使用 , 分割。

  class Rectangle:

  def area(self):

  print("矩形求面积")

  class Diamond:

  def area(self):

  print("菱形求面积")

  class Square(Rectangle,Diamond): #总是按照这里的先后顺序,一一继承

  def t(self):

  self.area()

  s = Square()

  s.t()

  结果如下:

  成都python培训班:封装、继承和多态

  class Rectangle:

  def area(self):

  print("矩形求面积")

  class Diamond:

  def area(self):

  print("菱形求面积")

  class Square(Diamond,Rectangle): #总是按照这里的先后顺序,一一继承

  def t(self):

  self.area()

  s = Square()

  s.t()

  结果如下:

  成都python培训班:封装、继承和多态

  多继承:按照继承原则,每个父类看作一个分支。按照顺序进行查找,深度优先。但是有一个原则:子类一定会在父类之前被搜索。

  class Teacher:

  def __init__(self,name,group):

  self.name = name

  self.group = group

  def introcude(self):

  print(f"我的名字是{self.name},所在小组是{self.group}")

  def teach(self):

  print("输入代码")

  print("知识点讲解")

  class PythonTeacher(Teacher):

  def __init__(self,name,group):

  super().__init__(name,group)

  def teach(self):

  print("打开pycharm")

  super().teach()

  class JaVaTeacher(Teacher):

  def __init__(self,name,group):

  super().__init__(name,group)

  def teach(self):

  print("打开eslipse")

  super().teach()

  p = PythonTeacher("梁某人", 10)

  print(p.introcude(), p.teach())

  结果如下:

  成都python培训班:封装、继承和多态

  j = JaVaTeacher("梁三",666)

  print(j.group,j.teach())

  结果如下:

  成都python培训班:封装、继承和多态

  3|0多态

  这个在python中基本体现不出来,知道面向对象有多态这个特性就行了。

(责任编辑:范老师)
最新开班
  • 成都Java培训班
    免费试听名额发放中...
  • 成都C++培训班
    免费试听名额发放中...
  • 成都PHP培训班
    免费试听名额发放中...
  • 成都网络工程培训班
    免费试听名额发放中...
  • 成都Unity3D培训班
    免费试听名额发放中...
  • 成都大数据培训班
    免费试听名额发放中...
  • 成都uid培训班
    免费试听名额发放中...
  • 成都会计培训班
    免费试听名额发放中...
  • 成都Python培训班
    免费试听名额发放中...
  • 成都嵌入式培训班
    免费试听名额发放中...
  • 成都web培训班
    免费试听名额发放中...
  • 成都软件测试培训班
    免费试听名额发放中...
在线留言
提交

校区地址:成都市锦江区东大街紫东楼端35号明宇金融广场19楼1906室

联系电话:400-111-8989

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市高新区奥克斯广场蜀锦路209号一楼商铺

联系电话:400-111-8989

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都锦江区东大街芷泉街229号东方广场C座3楼303

联系电话:400-111-8989

公交路线:芷泉街(188路;115路;515路;236路;505路;501路;84路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市武侯区佳灵路3号红牌楼广场2号写字楼11楼1115号

联系电话:400-111-8989

公交路线:红牌楼东(11路;92路;100路;111路;139路;g28路;快速公交K1/K2) 地铁路线:红牌楼站(地铁3号线)

校区地址:成都市锦江区红星路二段70号四川日报大厦502-2

联系电话:400-111-8989

公交路线:市二医院站(6路;49路;102路;5路;37路;g92路;) 地铁路线:地铁市二医院(地铁3号线)

校区地址:成都市锦江区东大街芷泉段229号东方广场C座16层

联系电话:400-111-8989

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:四川省成都市武侯区高新科技孵化园9号园区E座7楼

联系电话:400-111-8989

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

了解达内动态
关注成都达内教育公众号

首页 | 关于达内 | 课程中心 | 专家师资 | 视频教程 | 学员空间 | 校企合作 | 新闻资讯 | 就业指导 | 网站地图

2016-2025 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56 蜀ICP备18021046号-3