zoukankan      html  css  js  c++  java
  • Python面向对象三大特性(封装、继承、多态)

    封装

    类中把某些属性和方法隐藏起来,或者定义为私有,只在类的内部使用,在类的外部无法访问,或者留下少量的接口(函数)供外部访问;从上一篇文章中的私有属性与私有方法中的代码体现了该特性。

    class man():
    	def __init__(self,name):
    		self.name = name
    		self.__passwd = "123456"
    
    	def changepass(self,newpasswd):
    		self.__passwd = newpasswd
    		print(self.__passwd)
    
    
    liming = man("liming")
    #没有liming.passwd/liming.__passwd属性
    #只能通过一下changepass方法来查看或修改内部属性
    liming.changepass("abc123456")
    

      

    继承

    一个种类里面,存在共有的属性和动作。比如动物类,存在共有的属性(长度、高度等)和动作(吃、跑、叫等)。在程序中是为了实现代码的重用,相同的代码不需要重复的编写。父类里定义的属性、方法自动被子类继承。

    比如下面的这个例子(仅继承):

    class dog:
    	def __init__(self,name):
    		self.name = name
    
    	def eat(self):
    		print("%s,正在吃..."% self.name)
    
    	def run(self):
    		print("%s,正在跑..."% self.name)
    
    class poodle(dog): #poodle(贵宾犬)是dog的子类.poodle类继承了dog类的所有属性与方法。
    	pass
    
    
    my_dog = poodle("小花")
    my_dog.eat()
    my_dog.run()
    #输出
    小花,正在吃...
    小花,正在跑...
    

      

    当然,子类不仅可以继承父类,还可以在父类的基础上增加其他方法和属性。

    class dog:
    	def __init__(self,name):
    		self.name = name
    
    	def eat(self):
    		print("%s,正在吃..."% self.name)
    
    	def run(self):
    		print("%s,正在跑..."% self.name)
    
    class poodle(dog): 
    	def lovely(self): #增加新的方法
    		print("%s is lovely!" % self.name)
    
    
    my_dog = poodle("小花")
    my_dog.eat()
    my_dog.run()
    my_dog.lovely()
    #输出
    小花,正在吃...
    小花,正在跑...
    小花 is lovely!
    

      

    重构父类方法(重写)

    重写父类方法:

    class dog:
    	def __init__(self,name):
    		self.name = name
    
    	def eat(self):
    		print("%s,正在吃..."% self.name)
    
    	def run(self):
    		print("%s,正在跑..."% self.name)
    
    class poodle(dog):
    	def run(self):
    		print("%s is running!" % self.name)
    
    
    my_dog = poodle("小花")
    my_dog.eat()
    my_dog.run()
    
    #输出
    小花,正在吃...
    小花 is running!
    

      

     

    先执行父类方法中的代码再执行子类方法中的代码:

    class dog:
    	def __init__(self,name):
    		self.name = name
    
    	def eat(self):
    		print("%s,正在吃..."% self.name)
    
    	def run(self):
    		print("%s,正在跑..."% self.name)
    
    class poodle(dog):
    	def run(self):
    		dog.run(self)
    		print("%s is running!" % self.name)
    
    
    my_dog = poodle("小花")
    my_dog.eat()
    my_dog.run()
    
    #输出
    小花,正在吃...
    小花,正在跑...
    小花 is running!
    

      

    完全重构构造函数:

    class dog:
    	def __init__(self,name):
    		self.name = name
    
    	def eat(self):
    		print("%s,正在吃..."% self.name)
    
    	def run(self):
    		print("%s,正在跑..."% self.name)
    
    class poodle(dog):
    	def lovely(self):
    		print("%s is lovely!" % self.name)
    
    
    class jiwawa(dog):
    	def __init__(self,name,gun):
    		dog.__init__(self,name)
    		self.gun = gun
    	def wawa(self):
    		print("%s 是吉娃娃狗种!" % self.name)
    	def xgun(self):
    		print("%s" % self.gun)
    
    
    dog1 = poodle("小花")
    dog1.eat()
    dog1.run()
    
    dog2 = jiwawa("小黑","yes")
    dog2.wawa()
    dog2.xgun()
    
    ##输出
    小花,正在吃...
    小花,正在跑...
    小黑 是吉娃娃狗种!
    yes
    

     

    也可以使用这种写法

    super(jiwawa,self).__init__(name)
    

      

    新式类与经典类

    经典类是老版本,新式类是新版版。

    #经典类
    class dog:
    
    #新式类
    class dog(object):
    

      

    #经典类写法
    dog.__init__(self,name)
    #新式类写法
    uper(jiwawa,self).__init__(name)
    

      

    经典类与新式类的区别:多继承。

    多继承

    class dog:
    	def __init__(self,name):
    		self.name = name
    
    	def eat(self):
    		print("%s,正在吃..."% self.name)
    
    	def run(self):
    		print("%s,正在跑..."% self.name)
    
    class Relation(object):
    	def makefriends(self,obj):
    		print("%s要和%s交朋友!" % (self.name,obj.name))
    
    
    class poodle(dog,Relation):
    	def lovely(self):
    		print("%s is lovely!" % self.name)
    
    
    class jiwawa(dog):
    	def __init__(self,name,gun):
    		#dog.__init__(self,name)
    		super(jiwawa,self).__init__(name)
    		self.gun = gun
    	def wawa(self):
    		print("%s 是吉娃娃狗种!" % self.name)
    	def xgun(self):
    		print("%s" % self.gun)
    
    dog2 = jiwawa("小黑","yes")
    dog1 = poodle("小花")
    
    dog1.makefriends(dog2)
    
    #输出
    小花要和小黑交朋友!
    

      

    多态

    • 多态不同的子类对象调用相同的父类方法,产生不同的执行结果
    • 多态可以增加代码的灵活度,以继承和重写父类方法为前提是调用方法的技巧,不会影响到类的内部设计
    • 同一个接口多种实现
    class dog:
    	@staticmethod
    	def dog_run(obj):
    		obj.run()
    
    class poodle(dog):
    	def run(self):
    		print("贵宾犬,正在跑!")
    
    class jiwawa(dog):
    	def run(self):
    		print("吉娃娃,正在跑")
    
    d1 = poodle()
    d2 = jiwawa()
    dog.dog_run(d1)
    dog.dog_run(d2)
    

      

  • 相关阅读:
    线段树、最短路径、最小生成树、并查集、二分图匹配、最近公共祖先--C++模板
    数据结构中各种树
    你必须知道的基本位运算技巧(状压DP、搜索优化都会用到)
    memset为int型数组初始化问题
    Dev-C++添加代码格式化(format source code)工具Artistic Style
    让vs IIS Express支持本地静态Json文件
    什么是「供给侧改革」? 原标题:中央提的“供给侧改革”是啥意思?有谁能解说下吗?
    PowerDesigner用法和技巧
    php 调用 web Server(短信接口示例)
    sae相关配置
  • 原文地址:https://www.cnblogs.com/endust/p/12317456.html
Copyright © 2011-2022 走看看