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覆盖为ha中的a,而将haha中的a传递给ha中的a,a=3。然后打印3的平方和c=2。

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

为了更方便理解,我们改写一个变量名(把haha中的a改成b):

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

 我们先运行haha,输入b=3,e=10,接着得到self.hh=15,然后进入ha的构造函数。b,e分别传给a,d。因此a=3,b=10。self.hh被覆盖为3,然后打印d=10。接着继续运行haha的构造函数打印self.hh=3,然后进入qw函数打印3的平方和c=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

即a=10,d=3      。。。。。。

 

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

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

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日

 

 

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独白不白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值