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)

  

 

posted @ 2020-02-16 16:42  看不尽的尘埃  阅读(261)  评论(0编辑  收藏  举报