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