python之类的继承
继承是为了代码复用和设计复用而设计的,是面向对象程序设计的重要特征之一。当我们设计一个新类时,如果可以继承一个已有的设计良好的类,然后进行二次开发,无疑会大幅度减少开发工作量。
1. 类继承语法:
Class 派生类名(基类名): #基类名写在括号里
派生类成员
在继承关系中,已有的,设计好的类称为父类或基类,新设计的类称为子类或派生类。派生类可以继承父类的公有成员,但是不能继承其私有成员。
在python中继承的一些特点:
2. 类继承的特点:
A、 在继承中基类的构造函数(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用
B、 如果需要在派生类中调用基类的方法时,通过“基类名.方法名()”的方法来实现,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self 参数。也可以使用内置函数super()实现这一目的。
C、 Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找(先在本类查找调用的方法,找不到才去基类中找)。
3. 类的重构实例:
#Author:Anliu #加入在某个登录系统有多类用户,每个用户的功能各有不同,但是他们有共同的功能。例如: # user:登录,查看,添加主机,添加密码,上传软件包 # admin: 登录,查看,添加账号,删除账号,锁定账号,访问接口。 # superadmin: 登录,查看,添加账号,删除账号,锁定账号,修改域,修改产品树。 #我们可以使用面相对象的方法来实现: #定义类:类1:user # 类2:admin # 类3:superadmin # 此外也可将共同实现的方法抽象出来,作为父类,共以上子类调用 # 类4:common :定义三种用户的功能方法 “登录,查看”。 # 类5:account_manage: 定义用户的管理方法 “账号的添加,删除与冻结”。 class common: def __init__(self,name): self.name = name def logging(self): print("%s is loggin..."%self.name) def scan(self): print("%s scan.."%self.name) class account_manage: def __init__(self,name): self.name = name def account_add(self): print("%s is add account..."%self.name) def account_del(self): print("%s is del account..."%self.name) def account_frozen(self): print("%s is frozon account.."%self.name) class user(common): #继承common类的方法 ''' 此类完成user用户的相关功能,继承父类common的方法 ''' def __init__(self,name,ip): #初始化子类,需要定义好父类的参数 common.__init__(self,name) #重构父类方法 self.ip = ip def add_host(self): print("%s add user &s"%self.name,self.ip) def add_pass(self): print("add passwd") def upload_package(self): print("upload package..") #倘若需要给父类方法添加新的功能,在loggin的时候判断自己是谁,此时需要重构父类方法 def logging(self): common.logging(self) #重构父类,并传递self值。 print("who is this ...") class admin(common): #定义admin类,继承common类 def access_api(self,name): print("%s access API of ...."%name) #user1 = user("anliu") #user1.scan() #调运父类方法 #user1.add_host("anliu","192.168.42.111") #调运子类方法 #user1.logging() #在没有对父类方法重构之前直接调运父类的方法,执行的是子类自己的定义的方法, #若需要添加新功能则需要重构父类方法。 #user1.logging() #重构后,将显示父类和子类所拥有的方法。 admin1 = admin("admin") #实例化admin类 admin1.access_api("admin") #调运access_API方法 admin1.scan() #调运scan方法 #若此时需要给user添加一个功能,在登录的时候判断hosts存不存在(需要多传递一个参数), #而admin用户则不需要该功能。怎么破? #若修改common类,则所有用户调运都发生变化,此时需要重构父类方法 user1 = user("user1","192.168.42.111") user1.scan() user1.add_host()
4.多类继承
#Author:Anliu #Author:Anliu #加入在某个登录系统有多类用户,每个用户的功能各有不同,但是他们有共同的功能。例如: # user:登录,查看,添加主机,添加密码,上传软件包 # admin: 登录,查看,添加账号,删除账号,锁定账号,访问接口。 # superadmin: 登录,查看,添加账号,删除账号,锁定账号,修改域,修改产品树。 #我们可以使用面相对象的方法来实现: #定义类:类1:user # 类2:admin # 类3:superadmin # 此外也可将共同实现的方法抽象出来,作为父类,共以上子类调用 # 类4:common :定义三种用户的功能方法 “登录,查看”。 # 类5:account_manage: 定义用户的管理方法 “账号的添加,删除与冻结”。 #对于admin以及superadmin类都可继承common和account_manage类,此处可用多个类的继承 class common: def __init__(self,name): self.name = name def logging(self): print("%s is loggin..."%self.name) def scan(self): print("%s scan.."%self.name) class account_manage: def __init__(self,name,user_id): self.name = name self.user_id = user_id def account_add(self): print("%s is add account...%s"%(self.name,self.user_id)) def account_del(self): print("%s is del account..."%self.name) def account_frozen(self): print("%s is frozon account.."%self.name) class user(common): #继承common类的方法 ''' 此类完成user用户的相关功能,继承父类common的方法 ''' def __init__(self,name,ip): #初始化子类,需要定义好父类的参数 common.__init__(self,name) #重构父类方法 self.ip = ip def add_host(self): print("%s add user &s"%self.name,self.ip) def add_pass(self): print("add passwd") def upload_package(self): print("upload package..") #倘若需要给父类方法添加新的功能,在loggin的时候判断自己是谁,此时需要重构父类方法 def logging(self): common.logging(self) #重构父类,并传递self值。 print("who is this ...") #user1 = user("user1","192.168.42.111") #user1.scan() #user1.add_host() class superadmin(common,account_manage): ''' 该类实现superadmin的功能,继承common类以及account_manage类 ''' def __init__(self,name,user_id,zone): #构造superadmin类,需要添加所有父类的方法 self.zone = zone common.__init__(self,name) #重构common父类方法 account_manage.__init__(self,name,user_id) #重构account_manage父类方法 def mod_zone(self): print("mod zone of %s"%self.zone) superadmin1 = superadmin("superadmin",11,"beijing") superadmin1.scan() superadmin1.account_add() superadmin1.mod_zone()
5.经典类和新式类的继承
#Author:Anliu #Author:Anliu #加入在某个登录系统有多类用户,每个用户的功能各有不同,但是他们有共同的功能。例如: # user:登录,查看,添加主机,添加密码,上传软件包 # admin: 登录,查看,添加账号,删除账号,锁定账号,访问接口。 # superadmin: 登录,查看,添加账号,删除账号,锁定账号,修改域,修改产品树。 #我们可以使用面相对象的方法来实现: #定义类:类1:user # 类2:admin # 类3:superadmin # 此外也可将共同实现的方法抽象出来,作为父类,共以上子类调用 # 类4:common :定义三种用户的功能方法 “登录,查看”。 # 类5:account_manage: 定义用户的管理方法 “账号的添加,删除与冻结”。 #对于admin以及superadmin类都可继承common和account_manage类,此处可用多个类的继承 #class common: #经典类 class common(object): #新式类 def __init__(self,n1): pass def logging(self): print("%s is loggin..."%self.name) def scan(self): print("%s scan.."%self.name) #class account_manage: #经典类 class account_manage(object): #新式类 def __init__(self,name,user_id): self.name = name self.user_id = user_id def account_add(self): print("%s is add account...%s"%(self.name,self.user_id)) def account_del(self,obj): print("%s is del account...%s"%self.name,obj.name) def account_frozen(self): print("%s is frozon account.."%self.name) class user(common): #继承common类的方法 ''' 此类完成user用户的相关功能,继承父类common的方法 ''' def __init__(self,name,ip): #初始化子类,需要定义好父类的参数 common.__init__(self,name) #重构父类方法 self.ip = ip def add_host(self): print("%s add user &s"%self.name,self.ip) def add_pass(self): print("add passwd") def upload_package(self): print("upload package..") #倘若需要给父类方法添加新的功能,在loggin的时候判断自己是谁,此时需要重构父类方法 def logging(self): common.logging(self) #重构父类,并传递self值。 print("who is this ...") class superadmin(common,account_manage): #类的执行顺序是从左向右。 ''' 该类实现superadmin的功能,继承common类以及account_manage类 ''' def __init__(self,name,user_id,zone): #构造superadmin类,需要添加所有父类的方法 self.zone = zone common.__init__(self,name) #重构common父类方法 account_manage.__init__(self,name,user_id) #重构account_manage父类方法 def mod_zone(self): print("mod zone of %s"%self.zone) superadmin1 = superadmin("superadmin",11,"beijing") #获取类的参数将在整个继承的类中寻找 superadmin1.scan() superadmin1.account_add() superadmin1.mod_zone()
经典类和新式类的继承关系:
经典类和新式类的对子类以及子类的构造函数继承顺序上有差异:
在python2上,经典类是按深度优先来继承的,新式类是安装广度优先来继承的。
在python3上,经典类和新式类都统一是安装广度优先来继承。
实际上在python3中已经不存在经典类的概念,系统默认就是新式类:
#Author:Anliu #在经典类的继承过程中,构造函数的继承关系是“广度继承” #一下实例:D-->B--->C--->A class A(object): def __init__(self): #def testa(self): print("IN A") class B(A): #def __init__(self): #def testb(self): print("IN B") class C(A): #def __init__(self): #def testc(self): print("IN C") class D(B,C): #def __init__(self): #def testd(self): print("IN D") d1 = D() #d1.testd()