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()



原文地址:https://www.cnblogs.com/anttech/p/12830508.html