封装
封装,即将类里面的属性与方法封装在类中,对外界隐藏,不让别的类进行自由访问和修改,需要以特定的方法访问。
——代码如下:
class Fengzhuang:
#封装属性
fz1=0
fz2=1
#封装方法
def fzf(self):
print(self.fz1,self.fz2)
fz=Fengzhuang()
fz.fzf()#在类外通过方法访问属性
继承
继承介绍以及经典类和新式类
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 ——百度百科
在python2.2之前,所有类均为经典类,python2.7中,仍然支持经典类。而在python3.x中,所有类均为新式类。
在新式类中,类的类型均为type,查找方法为广度优先(经典类是深度优先)。此外,新式类还增加了很多方法与函数。
单继承和多继承
单继承
即子类只有一个父类,代码示例如下:
class Grandfather():#默认继承Object类
def sleep(self):
print('Grandfather sleep')
class Father(Grandfather):#Father类继承Grandfather类
pass
father=Father()
father.sleep()#使用Grandfather的sleep方法
其中,所有类都默认继承Object类,Object类是基类(顶级类);其他子类叫做派生类。
当子类和父类出现同名方法时,实例对象会调用子类的方法,称为覆写
——代码如下:
class Grandfather():#默认继承Object类
def sleep(self):
print('Grandfather sleep')
class Father(Grandfather):#Father类继承Grandfather类
def sleep(self):#覆写父类中的sleep方法
print('Father sleep')#输出Father sleep
father=Father()
father.sleep()
super函数
当需要使用父类的同名方法时,可以使用super函数。
——代码如下:
class Grandfather():#默认继承Object类
def sleep(self):
print('Grandfather sleep')
class Father(Grandfather):#Father类继承Grandfather类
def sleep(self):#覆写父类中的sleep方法
print('Father sleep')#输出Father sleep
super(Father,self).sleep()#调用super方法,调用Grandfather里的sleep方法,输出Grandfather sleep
构造方法和私有的继承
构造方法的继承和普通方法、类方法和静态方法的继承一样,按一般的继承规则继承。
class Grandfather():#默认继承Object类
def __init__(self):
print('我是祖父')
class Father(Grandfather):#Father类继承Grandfather类
def __init__(self):#覆写Grandfather里的构造方法
print('我是父亲')
father=Father()#输出“我是父亲”
但是私有不同,私有不会被子类继承,只能在类内调用。
——测试代码如下:
class Grandfather():#默认继承Object类
def __init__(self):
print('我是祖父')
self.__age__=90
class Father(Grandfather):#Father类继承Grandfather类
pass
father=Father()
grandfa=Grandfather()
print(father.__age__)#报错,因为没有继承属性
若想通过子类访问父类私有属性,则需要在父类中提前创建相关方法。
——代码如下:
class Grandfather():#默认继承Object类
def __init__(self):
print('我是祖父')
self.__age__=90
def get_age(self):
print(self.__age__)
class Father(Grandfather):#Father类继承Grandfather类
pass
father=Father()
father.get_age()#调用父类相关方法,输出__age__
多继承
即一个子类继承多个父类,示例如下:
class Uncle():
pass
class Father():
pass
class Son(Father,Uncle):#继承Father和Uncle
pass
多继承中的查找顺序
多继承遵循左边优先原则,代码示例如下:
class Uncle():
def sleep(self):
print('Uncle sleep')
class Father():
def sleep(self):
print('Father sleep')
class Son(Father,Uncle):#多继承,Father在左
pass
son=Son()
son.sleep()#根据左边优先原则,调用Father里的sleep,输出Father sleep
当出现以下情况时,多继承遵循左边优先、其次深度原则,优先调用Grandfather里的方法。
——示例代码如下:
class Grandfather():
def eat(self):
print('Grandfather eat')
class Uncle():
def eat(self):
print('Uncle eat')
class Father(Grandfather):
pass
class Son(Father,Uncle):#多继承,Father在左
pass
son=Son()
son.eat()#根据左边优先、深度优先原则,调用Grandfather里的eat()
出现以下情况时,即继承的两个父类有共同父类且左边父类没有所需方法,优先调用Uncle中的方法。
代码示例如下:
class Grandfather():
def eat(self):
print('Grandfather eat')
class Uncle(Grandfather):
def eat(self):
print('Uncle eat')
class Father(Grandfather):
pass
class Son(Father,Uncle):#多继承
pass
son=Son()
son.eat()#调用Uncle里的eat()
多态
多态,是以封装和继承为前提,即不同的子类调用相同的方法,产生不同的结果。
——代码示例如下:
class Grandfather():
def eat(self):
print('Grandfather eat')
class Father(Grandfather):
def eat(self):
print('Father eat')
class Son(Father):
def eat(self):
print('Son eat')
grandfather=Grandfather()
father=Father()
son=Son()
#多态实现
grandfather.eat()
father.eat()
son.eat()