zoukankan      html  css  js  c++  java
  • 类基础知识点

    类的继承与派生

    继承是指类与类之间的关系,用来解决代码重用,类可继承一个或多个父类,父类又可以成为基类或超类,新建类称为派生类或子类

    class OldboyStudent:  # 父类
        school = 'oldboy'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def learn(self):
            print('%s is learn' % self.name)
    
        def eat(self):
            print('%s is eating' % self.name)
    
        def sleep(self):
            print('%s is sleeping' % self.name)
    
    
    class ParentClass:  # 父类
        pass
    
    
    class SubClass(ParentClass): # 单继承,基类是ParentClass,派生类是SubClass
        pass
    
    
    class SubClass2(ParentClass, OldboyStudent):   python支持多继承,用逗号分隔开多个继承的类
        pass
        
    s1 = OldboyStudent('李坦克', '男', 18)
    OldboyStudent.eat(s1)
    s1.eat()  # OldboyStudent.eat(s1) 与 s1.eat()等效,都是绑定s1到方法eat,

    查看继承

    SubClass.__bases__
    (<class '__main__.ParentClass'>, <class '__main__.OldboyStudent'>)
    SubClass.__base__
    <class '__main__.ParentClass'>

    __base__只查看从左到右继承的第一个子类,__bases__查看所有继承的父类(<class 'main.ParentClass1'>,)

    经典类与新式类

    1 只有在python2中才分新式类和经典类,python3统一都是新式类

    2 在python2中,没有显示继承object类的类,以及该类的子类,都是经典类,反正都是新式类

    3 在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类

    print(ParentClass.__bases__)  # obje是所有python类的基类,它提供了一些常用如 __str__的实现
    (<class 'object'>,)

    属性查找

    示例代码
    class Foo:
        def f1(self):
            print('Foo.f1')
    
        def f2(self):
            print('Foo.f2')
            self.f1()
    
    class Bar(Foo):
        def f1(self):
            print('Bar.f1')
    
    
    b=Bar()
    b.f2()
    
    # 打印结果:
    # Foo.f2
    # Bar.f1

    代码解析
    b=Bar()先产生一个对象b,再通过__init__初始化对象b,类Bar作为一个派生类,含有基类Foo,它将继承Foo的数据及方法属性.b.f2()则将属性f2绑定到b,b将在自身属性里查找f2(),因为类Bar(Foo)并定制__init__,因此对象将不会拥有自己的属性,只能到类里面找

    print(b.__dict__)  # 执行后为空字典,找不到f2
    {}

    自身类不含f2,因此对象将从继承的基类F00里面找,找到f2,打印Foo.f2,在F00类中的f2()里,存在self.f1(),将f1()实例化绑定到b,相当于b.f1(),因此,对象b将从自身属性开始找,然后到它的类里找,终于找到了f1(),打印Bar.f1

    派生

    子类可以添加自己新的属性或者重新定义这些属性(不会影响到父类),一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。

    在子类中,在编辑函数内功能的时候,有可能需要重用父类中重名的那个函数功能,用调用普通函数的方式,即:类名.func(),此时就与调用普通函数无异了,因此即便是self参数也要为其传值 class Foo: def init(self,name,age) self.name = name self.age = age def f1(self): print('Foo.f1')

    def f2(self):
            print('Foo.f2')
            self.f1()
    
    
    class Bar(Foo):
        foo1 = 'foo'
        def __init__(self,name,age):
            Foo.__init__(self,name,age)  # 调用父类函数
            self.age1 = age  # 新属性
        def f1(self):
            print('Bar.f1')
        def f2(self):
            print('Foo.f1')  # 定义新方法
            
       b = Bar('猪',18
       )
       b.f2()
       print(b.age1)
       # 结果
       Foo.f1
       18
  • 相关阅读:
    Linux 改变文件的所有者
    Opencv -lippicv
    数据结构--二叉搜索树
    Window下cmd查看目录结构
    windows cmake与nmake
    Ubuntu18.04安装caffe python3.6 opencv3.2 CPU
    apt-get install 下载速度慢问题的解决
    使用pip安装速度慢问题的解决
    神经网络可视化
    【VS】代码行无法折叠及ctrl+鼠标左键无法跳转到定义的问题
  • 原文地址:https://www.cnblogs.com/zhoudabing/p/10434885.html
Copyright © 2011-2022 走看看