美文网首页
多重继承,模块和包

多重继承,模块和包

作者: 快去学习不然怎么去看aimer | 来源:发表于2019-09-25 19:20 被阅读0次

    多重继承

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def run(self):
            print(f'{self.name} is running')
            return "wrfrwedww"                             # 方法重写时,注意备覆盖的方法是否有 
                                                                       # 返回值等等,被其他方法使用
    
        def  dosome(self):
            r = self.run()
            print( r.upper())
    
    class Teacher(Person):
        def talk(self):
            print(f"{self.name} is talking...")
    
        def  run(self):
            print(f"{self.name} 你是最棒的!")       
            return  "erfrew"                                           
    
    s = Person('anan',29)
    t = Teacher('shark',19)
    s.dosome()
    t.dosome()
    
    
    class A():
        pass
    class B(A):
        pass
    
    print(B.__mro__)       ##继承顺序,所有类都会继承<class object>
    
    
    class A :
        def __init__(self,name ,age):
             self.name = name
             self.age = age
    class B(A):
        def __init__(self,name,age,level):
              A.__init__(self,name,age)       #继承方式一
              super().__init__(name ,age)     #继承方式二
              self.name = name                   #继承方式三
              self.age = age
              self.level = level
    
    print(B.__mro__)                              #显示继承层级,万物继承于object
    
    #继承中的返回值问题
    class A:
        def __init__(self,name ,age):
            self.name = name
            self.age = age
        def run(self):
             return "222"
    
    class B(A):
         def __init__(self,name,age,level):
            A.__init__(self,name,age)
            self.level = level
         def run(self):
            return "abc"            #如果父类的方法中有返回值,而子类继承覆写的时候没有返回值的话就会出错
                                            #所以覆写的时候应该注意返回值的问题   
    obj=B('shark',18,1)  
    obj.run()
    print(obj.__dict__)             #输出字典格式
    

    私有属性

    class Person:
        def __init__(self,f_name,s_name):
            # 私有属性,只有在内部才能使用,使用时也要加__
            self.__f_name = f_name
            self.s_name = s_name
    
        # 特性
        @property
        def full_name(self):
            return f"{self.__f_name} {self.s_name}"
    
    obj = Person("song","rou")
    print(obj.full_name)
    
    class A:
        def __run(self):         #只能在类里才能使用
            pass
    
    class B(A) :
        pass
    
    B().__run()    #无法被继承
    obj = B()
    obj._A__run()      #其实就是改名,使得私有方法无法被调用 , 将名字改为_A__run
    
    
    def tail_t(arg):
        if isinstance(arg,(list,tuple)):    #判断arg是否属于list或tuple
            n = arg
        else :
            n = [arg]
    
        for i in n :
            print(i)
    
    tail_t("/root/")
    

    模块和包

    /testpy/test/day12/cmdb
    ├── bin
    │   └── run.py
    └── plugins
        ├── cpu.py
        ├── memory.py
        └── __pycache__
    
    bin内写要执行的文件,在plugins内写被调用的模块,二者组成一个包
    
    在run.py中的代码:
    #!/usr/local/bin/python3
    import sys,os
    dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #得到run.py的目录路径
    sys.path.insert(0,dir)      #将路径添加到python的PATH中,让python在查找时可以将自己的包被调用
    from plugins import cpu,memory   从plugins包内调用cpu,memory模块
    
    cpu = cpu.Cpu()
    mem = memory.Mem()
    
    for obj in [cpu,mem]:
        info = obj.cmd_handle()
        print(info)
    
    cpu.py中代码:
    class Cpu():
        def cmd_handle(self):
            return "cpu info"
    
    mem.py中的代码:
    class Mem():
        def cmd_handle(self):
            return "mem info"
    

    当调用自己定义的包时,要定义_init_.py,因为在代码中使用import调用模块只会调用_init_.py中的
    方法,因此,在代码中要将自己定义的包的路径加到python的环境变量中,这样就可以在代码中调用包内的方法

    run.py的内容,与包pkg位于统一级目录里:
    # import pkg
    # print(y)   #使用import只能导入__init__.py内的东西
                          #因此,当__init__.py内没有导入mod1.py时,使用
                        #import mod1 报错
    
    # from pkg import mod1,x
    # print(x)                    #使用from,在__init__.py中可以不用有导入模块的语句
    
    import sys 
    
    sys.path.insert(0,"/testpy/test/day12/pkg")
    # print(sys.path)
    import mod1
    
    print(mod1.y)
    

    _init_.py和mod1.py在包pkg里.

    __init__.py的内容:
    x = 1
    import mod1
    
    mod1.py的内容:
    y = 2
    

    name 的作用

    def foo():
        return 1
    if __name__ is "__main__":
        a = foo()
        print(a) 
    

    当导包时,name不等于main,因此不会在该模块内调用函数,当该文件被执行时,name就与main相等。

    相关文章

      网友评论

          本文标题:多重继承,模块和包

          本文链接:https://www.haomeiwen.com/subject/knyhyctx.html