python类(class)的定义、使用、继承、应用的通俗易懂理解

这篇具有很好参考价值的文章主要介绍了python类(class)的定义、使用、继承、应用的通俗易懂理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.为什么使用类

        一个类(class)可以包囊众多函数,所以一般使用类的情况下,都需要用到众多有共性的函数,把这些可能会一起调用的函数或者需要接连调用的函数归为一个类,这样需要使用的时候可以轻易的找到。

        在处理不同细节时使用的类区别开来会使得代码更加的清晰。特别是像交互弹窗这样的程序,如果需要做多页跳转,每一页的布局十分复杂时,使用类会让写代码时的头脑更加清晰。

2.基本的使用方式举例

class ha:

    def __init__(self,a):
        self.hh=a

    def qw(self):
        print(self.hh**2)

    def mm(self):
        if self.hh==9:
            return 0


ha.qw(ha(3))

 结果:

9

进程已结束,退出代码为 0

        首先定义一个类,名为ha,然后用init定义所有函数的共同参数,因为init构造函数是会在调用整个类时自动运行的,所以不需要主动调用。如图,即使没有主动调用init函数,也可以将init中的参数用于qw函数,而mm函数不会自动调用

---------------------------------------------------------------------------------------------

3.类的特点,结构

        1.类中的每个函数的第一个形参必须一致,通常命名为self,你也可以选择自己命名更简单的写法(但是不规范)。

        2.类的第一个函数通常为init函数,这个函数为构造函数,也是整个类中最特殊的函数,它的主要目的是传递其他函数需要的参数,或者调用其他函数也让他们自动运行。

        3.构造函数没有返回值,但是其他函数可以返回一个值。

        4.不主动调用类中的某个非构造函数的函数,则该函数不会被运行。

        5.构造函数不是直接将形参传递给其他函数,而是定义一个新的,有特定形式的变量来储存这个形式参数(如上例self.hh=a,其中self.hh为定义的变量,a为调用这个类时需要传入的形参,赋值给self.hh,self.hh可以被直接使用,而a只能在构造函数中使用。  原因是self是所有函数的共同属性,而a只是构造函数中的一个参数),这个变量可以在其他函数中直接使用,与global全局变量的方式一致。

       6.定义类时,一般不含有括号(如上例class ha:),也可以使用括号,代表着这个类需要与另一个类共享属性和参数,即,你可以在这个类中调用另一个类的函数。另外,如果使用的是python库中的类的函数,则可以不需要写入括号也能调用。

**********************************************************

类继承的调用示例:

class ha:

    def __init__(self,a):
        self.hh=a

    def qw(self,c):
        print(self.hh**2)
        print(c)

    def mm(self):
        if self.hh==9:
            return 0


class haha(ha):
    def __init__(self,a):
        self.hh = 15
        # super().__init__(a)
        print(self.hh)

    def aw(self):
        self.hh=10
        print(self.hh)


haha(a=3).qw(c=2)

先注释掉super。

在上例的基础上,增加了haha类,haha类为子类,继承父类(ha)的属性和参数。

也就是说我们可以在haha中调用ha中除了构造函数的其他的函数。

 

结果:

15
225
2

        我们在haha中调用qw函数则需要在haha中传入a参数,这里a=3,然后向qw传入c=2。我们先是调用的haha类,再只调用ha类中的qw函数,因此先自动执行了haha类的构造函数,打印了15。再进入qw函数分别打印15的平方和c(也就是2)。

   **********************************************************************************************     

当我们使用super时,则可以调用父类的构造函数:

class ha:

    def __init__(self,a):
        self.hh=a

    def qw(self,c):
        print(self.hh**2)
        print(c)

    def mm(self):
        if self.hh==9:
            return 0


class haha(ha):
    def __init__(self,a):
        self.hh = 15
        super().__init__(a)
        print(self.hh)

    def aw(self):
        self.hh=10
        print(self.hh)


haha(a=3).qw(c=2)

取消掉注释,得到结果:

3
9
2

这里先得到self.hh=15,但是由于调用了父类的构造函数,将15覆盖为a,a=3,下如上同理。

*******************************************************************************************

为了更方便理解,我们改写一个变量名:

class ha:

    def __init__(self,a):
        self.hh=a

    def qw(self,c):
        print(self.hh**2)
        print(c)

    def mm(self):
        if self.hh==9:
            return 0


class haha(ha):
    def __init__(self,b):
        self.hh = 15
        super().__init__(b)
        print(self.hh)

    def aw(self):
        self.hh=10
        print(self.hh)


haha(b=3).qw(c=2)

结果与上一致。因此我们得出结论:super().__init__(b)是将子类构造函的形参b传递给父类构造函数的形参a,他们之间是一一对应的,所以也要求两类的形参数量一致,否则会报错。

****************************************************************************************** 

多个变量传递的例子:

class ha:

    def __init__(self,a,d):
        self.hh=a
        print(d)

    def qw(self,c):
        print(self.hh**2)
        print(c)

    def mm(self):
        if self.hh==9:
            return 0


class haha(ha):
    def __init__(self,b,e):
        self.hh = 15
        super().__init__(b,e)
        print(self.hh)

    def aw(self):
        self.hh=10
        print(self.hh)


haha(b=3,e=10).qw(c=2)
10
3
9
2

我们再反转e,b的传入顺序:

class ha:

    def __init__(self,a,d):
        self.hh=a
        print(d)

    def qw(self,c):
        print(self.hh**2)
        print(c)

    def mm(self):
        if self.hh==9:
            return 0


class haha(ha):
    def __init__(self,b,e):
        self.hh = 15
        super().__init__(e,b)
        print(self.hh)

    def aw(self):
        self.hh=10
        print(self.hh)


haha(b=3,e=10).qw(c=2)

得到:

3
10
100
2

因此上结论得证(他们之间是一一对应的,所以也要求两类的形参数量一致,否则会报错。)。

********************************************************************

4.应用到tkinter库交互弹窗

        我们假如需要利用到用户点击一个按钮的次数作为条件,例如点击3次,或者6次等等,出现一个弹窗那么写一个类更加方便,因为这个循环次数可以被拿出来写在构造函数中做一个统一归类。因为个人还没能力写比较复杂的交互弹窗,因此这里只浅浅感受一下:

        部分代码为:

class qmqm:
    def __init__(self):
        self.i = 0
        self.zujian()

    def zujian(self):
        global b

        def dw():
            if self.i<=2:
                self.i+=1
                messagebox.showinfo(title='中计了吧',message="送你一朵花,欠款*%d" %self.i)
            else:
                messagebox.showinfo(title='够了',message='你已经还不起了,别在点了')

        我们将循环次数i放进构造函数中,如果未来需要调用,则可以在其他类中用super类调用父类构造函数取得i的值。达成弹窗:

2月7日文章来源地址https://www.toymoban.com/news/detail-834807.html

到了这里,关于python类(class)的定义、使用、继承、应用的通俗易懂理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 理解C#委托(Delegate)通俗易懂,深入浅出

    委托首先是一个数据类型,我们可以像定义结构体一样定义一个委托类型,委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变 委托的定义 例如: 在定义委托类型时要指定函数的参数类型和返回值,一旦声明了委托类型,委托对象必须使用

    2024年02月02日
    浏览(52)
  • 通俗易懂,Spring Bean生命周期管理的理解

    目录 1、实例化阶段 2、初始化阶段 3、销毁阶段 总结 在Spring框架中, Bean是最基本的组件,它是Spring框架中的一个Java对象 。 下面通过@Bean来理解bean的生命周期: 在Spring框架中,@Bean注解用于告诉Spring框架一个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的

    2024年02月21日
    浏览(36)
  • 通俗易懂 快速理解 JDK动态代理 和 cglib动态代理

    动态代理的实现方案有两种, JDK动态代理 和 CGLIB动态代理 ,区别在于JDK自带的动态代理,必须要有接口,而CGLIB动态代理有没有接口都可以。 JDK动态代理 :JDK原生的实现方式,需要被代理的目标类必须实现接口。因为这个技术要求 代理对象和目标对象实现同样的接口 (兄

    2024年02月08日
    浏览(50)
  • 通俗易懂理解几何光学(四)光学系统中的光阑与光束限制

    在理想光学系统中,任意大小的物体能以任意宽的光束成一定倍率的像。当共轭距一定时,像的大小与物的大小成比例。 在实际光学系统中,成像光束将会受到限制: 成像系统中各个元件的大小有限,从而限制了物面上每一点发出并进入系统参与成像的光束的宽度; 像面的

    2024年02月05日
    浏览(50)
  • 【TypeScript】中定义与使用 Class 类的解读理解

    类是用于创建对象的模板。他们用代码封装数据以处理该数据。JavaScript 中的类建立在原型上,但也具有某些语法和语义未与 ES5 类相似语义共享。 TypeScript 除了实现了所有 ES6 中的类的功能以外,还添加了一些新的用法。 关于 ES6的 Class 类语法概念 ,在本章节不做过多阐述,

    2024年02月14日
    浏览(40)
  • uni小程序 自定义tabbars切换 闪动问题解决(通俗易懂)

    在小程序开发中,默认tabbar基本上是不能够满足我们的需求的,多数情况下都需要引入自定义的tabba, 但是在使用自定义tabbar的过程中就会遇到一些问题,例如切换闪动(由于tabbar页面跳转,组件重新创建导致)... 下面就看看怎么样去解决这个问题 其实很简单, 就是以组件

    2024年02月09日
    浏览(37)
  • 建造者模式深入理解:演示建造单个和多个产品的实践,结合模板模式,通俗易懂

    首先呢看下建造者的定义是什么样的,先读一遍 建造者模式 (Builder Pattern)是一种创建型设计模式,它主要用于将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表现形式。这种模式通过一系列可重用的独立的类(称为建造者或构建器)来一

    2024年01月22日
    浏览(43)
  • useVModel()的使用------通俗易懂

    用于父子组件共享数据, 1、父组件有个flag(Boolean)属性 2、将flag属性传递给子组件,要实现双向数据绑定 3、flag属性在子组件发生变化,父组件的flag属性一起改变 父组件app.vue 1、父组件有flag属性,使得flag和子组件uniInput双向绑定 2、使用v-model:flag进行双向绑定,v-model的默

    2024年01月15日
    浏览(39)
  • 通俗易懂读写锁ReentrantReadWriteLock的使用

    ReentrantReadWriteLock不知道大家熟悉吗?其实在实际的项目中用的比较少,反正我所在的项目没有用到过。 ReentrantReadWriteLock称为读写锁,它提供一个读锁,支持多个线程共享同一把锁。它也提供了一把写锁,是独占锁,和其他读锁或者写锁互斥,表明只有一个线程能持有锁资源

    2024年02月06日
    浏览(34)
  • SVM(支持向量机)进行分类的原理和python代码----通俗易懂

    SVM(支持向量机,Support Vector Machine)是一种非常流行的机器学习算法,可用于二分类和多分类问题。其基本思想是通过在不同类别的样本之间构建最大化分类间隔的线性或非线性超平面来实现分类。 SVM分类的基本步骤如下: 根据训练集数据,选取最优的超平面(通常为线性

    2024年02月11日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包