zoukankan      html  css  js  c++  java
  • Python面向对象三大特征之继承

    @数据分析 - jacky

    面向对象有三大特征,本文分享第二篇:继承

    继承实现代码的重用,相同的代码不需要重复的编写

    01 单继承

    1.1 继承的概念、语法和特点

    继承的概念:子类拥有父类的所有方法和属性
    @数据分析-jacky

    1)继承的语法
    class 类名(父类名):
    	pass
    
    • 子类继承父类,可以直接享受父类中已经封装好的方法,不需要再次开发

    • 子类中应该根据职责,封装子类特有的属性和方法

    2)继承的传递性
    • C类从B类继承,B类又从A类继承

    • 那么C类就具有B类和A类的所有属性和方法

    • 子类拥有父类以及父类的父类中封装的所有属性和方法

    1.2 方法的重写

    • 子类拥有父类的所有方法和属性

    • 子类继承自父类,可以直接享受父类中已经封装好的方法,不需要再次开发

    应用场景

    • 当父类的方法实现不能满足子类需求时,可以对方法进行重写(override)

    @数据分析-jacky
    重写父类方法有两种方法:

    1. 覆盖父类的方法
    2. 对父类方法进行扩展
    1)覆盖父类的方法
    • 如果在开发中,父类的方法实现和子类的方法实现,完全不同,就可以使用覆盖的方式,在子类中重新编写父类的方法实现

    • 具体的实现方式,就相当于在子类中定义了一个和父类同名的方法并且实现

    • 重写之后,在运行时,只会调用子类中重写的方法,而不再去调用父类封装的方法

    2)对父类方法进行扩展
    • 如果在开发中,子类的方法实现中包含父类的方法实现

      • 父类原本封装的方法实现是子类方法的一部分
    • 就可以使用扩展的方式

      1. 在子类中重写父类的方法
      2. 在需要的位置使用 super().父类方法 来调用父类方法的执行
      3. 代码其他的位置针对子类的需求,编写子类特有的代码实现

    关于 super

    • 在 Python 中 super 是一个特殊的类

    • super() 就是使用 super 类创建的对象

    • 最常使用的场景就是在重写父类方法时,调用 在父类中封装的方法实现

    1.3 私有属性和私有方法

    1) 应用场景及定义方式

    应用场景

    • 在实际开发中,对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问到

    • 私有属性就是对象不希望公开的属性

    • 私有方法就是对象不希望公开的方法

    定义方式

    • 在定义属性或方法时,在属性名或者方法名前增加两个下划线,定义的就是私有属性或方法
    class Women:
    	
    	def __init__(self,name):
    		
    		self.name = name
    		self.age = 18
    	def secret(self):
    		print("%s 的年龄是 %d" % (self.name,self.age))
    
    xiaoli = Women("小丽")
    
    print(xiaoli.age)
    
    xiaoli.secret
    
    >>> 18
    >>> 小丽的年龄是18
    		
    
    class Women:
    	
    	def __init__(self,name):
    		
    		self.name = name
    		self.__age = 18
    	def secret(self):
    		print("%s 的年龄是 %d" % (self.name,self.__age))
    
    xiaoli = Women("小丽")
    
    # 私有属性,在外界不能够被直接访问
    print(xiaoli.__age)
    
    xiaoli.secret
    
    >>> AttributeError:'Women' object has no attribute '__age'
    		
    
    
    class Women:
    	
    	def __init__(self,name):
    		
    		self.name = name
    		self.__age = 18
    	def secret(self):
    		# 在对象的方法内部,是可以访问对象的私有属性的
    		print("%s 的年龄是 %d" % (self.name,self.__age))
    
    xiaoli = Women("小丽")
    
    # 私有属性,在外界不能够被直接访问
    #print(xiaoli.__age)
    
    xiaoli.secret
    
    >>> 小丽 的年龄是 18
    		
    
    class Women:
    	
    	def __init__(self,name):
    		
    		self.name = name
    		self.__age = 18
    	def __secret(self):
    		# 在对象的方法内部,是可以访问对象的私有属性的
    		print("%s 的年龄是 %d" % (self.name,self.__age))
    
    xiaoli = Women("小丽")
    
    # 私有属性,在外界不能够被直接访问
    #print(xiaoli.__age)
    
    # 私有方法,同样不允许在外界直接访问
    xiaoli.__secret
    
    >>> AttributeError:'Women' object has no attribute '__secret'
    		
    
    2) 伪私有属性和私有方法(了解)

    提示:在日常开发中,不要使用这种方式,访问对象的私有属性或私有方法

    Python 中,并没有真正意义的私有

    • 在给属性、方法命名时,实际是对名称做了一些特殊处理,使得外界无法访问到

    • Python 解释器处理方式:在名称前面加上 _类名 => _类名__名称

    # 私有属性,外部不能直接访问到
    print(xiaoli._Women__age)
    
    # 私有方法,外部不能直接调用
    xiaoli._Women__secret()
    
    3)父类的私有属性和私有方法
    1. 子类对象不能在自己的方法内部,直接访问父类的私有属性或是有方法
    2. 子类对象可以通过父类的公有方法直接访问到私有属性或私有方法
    • 私有属性、方法 是对象的隐私,不对外公开,外界以及子类都不能直接访问

    • 私有属性、方法 通常用于做一些内部的事情

    class A:
    
    	def __init__(self):
    		
    		self.num1 = 100    # 定义公有属性
    		self.__num2 = 200    # 定义私有属性
    	
    	def __test(self):
    		print("私有方法 %d %d" % (self.num1,self.__num2))
    
    	def test(self):
    		# 这一步是关键,要认真体会: 在父类的公有属性(方法),调用父类的私有属性(方法)
    		print("父类的公有方法 %d" % self.__num2)
    		
    		# 自己的私有方法是可以调用自己的公有方法
    		self.__test
           
    
    class B(A)
    
       def demo(self):
    
    		# 1.在子类的对象方法中不能访问父类的私有属性
    		# print("访问父类的私有属性 %d" % self.__num2)   #会报错
    
    		# 2.在子类的对象中,不能调用父类的私有方法
    		# self.__test()    #会报错
    
    		# 3.访问父类的公有属性
    		print("子类方法 %d" % self.num1)
    
    		# 4.调用父类的公有方法
    		self.test()
    		pass
    		
    
    # 创建一个子类对象
    b = B()
    print(b)
    b.demo()
    
    # 在外界不能直接访问对象的私有属性/调用私有方法
    # print(b.__num2)  # 会报错
    # b.__test()   # 会报错
    
    >>> 子类方法 100
    >>> 父类的公有方法 200
    >>> 私有方法 100 200
    

    02 多继承

    概念

    • 子类可以拥有多个父类,并且具有所有父类的属性和方法
    • 多继承可以让子类对象,同时具有多个父类的属性和方法

    语法

    class 子类名(父类名1,父类名2 ... )
    	pass
    
    class A:
    	
    	def test(self):
    		print("test 方法")
    
    class B:
    
    	def demo(self):
    		print("demo 方法")
    
    # 定义 A类和B类的子类 C 类
    class C(A,B):
    
    	pass
    
    # 创建子类对象
    c = C()
    
    c.test()
    c.demo()
    
  • 相关阅读:
    局域网内的邮件收发
    小菜鸟入门nginx
    记一次结巴分词.net core 2.0版 nuget发布过程
    记一次 .net core publish 之后找不到视图文件的问题
    eShopOnContainer 第一步
    Ocelot网关统一查看多个微服务asp.net core项目的swagger API接口
    在Azure中创建asp.net core 应用
    微服务监控zipkin、skywalking以及日志ELK监控系列
    微服务监控zipkin+asp.net core
    Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)
  • 原文地址:https://www.cnblogs.com/shujufenxi/p/12148374.html
Copyright © 2011-2022 走看看