zoukankan      html  css  js  c++  java
  • 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()



  • 相关阅读:
    利用Lucene将被索引文件目录中的所有文件建立索引
    Carrot2 in action 初步印象
    Lucene建立索引搜索入门实例
    Lucene索引文件组成
    模拟浏览器登陆的基本思路与做法
    HttpWatch使用教程
    httpclient 怎么带上登录成功后返回的cookie值访问下一页面
    Google开源库-Volley的使用
    Android Material Design 学习笔记
    2015年山东省齐鲁软件大赛总结
  • 原文地址:https://www.cnblogs.com/anttech/p/12830508.html
Copyright © 2011-2022 走看看