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)