明明都定义好了,怎么还是说我没有声明啊?

2022-06-15 12:38:06 浏览数 (1)

今天五四青年节,祝大家青年节快乐!

闲来无事在家学习,突然有位粉丝发消息来问0这样的问题:明明都定义好了,还是说我没有声明啊?

为什么呢?因为你不是明明。

好了,看具体问题,原代码如下:

看代码的内容,大概是想实现输入一个关键词,查询zsms(我也不知道这是啥名字的拼音缩写)中包含关键词的内容,然后通过基础窗口控件QWidget展示出来。

现在在执行查询语句的时候,val这个变量传不到sql语句里,实在不知道咋搞了,来求教我了。

这都是一些基础问题,这个粉丝也是一位刚刚入行学习的小白,能看出来相关语法理解还是不透彻。

那么我就按照粉丝给我发的代码截图中内容,说下代码中的问题,互相学习,互相进步,我理解的不一定都对啊,仅供参考。

在截图的代码中,Demo类的中添加了一个还有def __init__(self):方法,这是此类的构造方法,这个跟Java的不太一样,Java的写法应该是Demo()。

然后,又编写了intiUI的方法,大概实现的内容就是刚才所讲的内容。问题是出在了val变量上。Sql执行代码的意思写一个动态传参,按照传入的关键词进行模糊搜索,但是现在找不到val变量。

这里呢,很简单,要是想取到初始化传入的val值,加上一个self.val就可以。self是什么?意思是类实例化后,self即代表着实例(对象)本身。从上下文中可以看出来,这里取val就是想拿初始化传入的val值。

相当于是这里,self.val就是在取Demo(“val”)传入的值。如果不加self,那么就是方法内部的局部变量,你使用的时候,需要传入或者定义。那么就得这么写def initUI(self, val):,在__init__中需要写成self.initUI(val)

虽然感觉有点别扭,但是能跑就行。毕竟写代码的理念就是,先上线,又优化。能跑起来再说。

除此之外,就截图代码中的还有潜在的问题。

  • 从sql的编写来看,命名不规范,zsms,zsbt,这是属性注释的拼音首字母,尤其这个表名。如果做二次开发,要是没有文档,我真是猜不出来啥意思。关于对变量、属性、类名如何命名,可以自行搜索阿里公开的《开发规范》
  • 其次,从使用到的cx_oracle上判断用的oracle,从新手学习角度,不建议上来就用oracle数据库,推荐先学MySQL。
  • 再者,从抽象和封装以及面向对象的设计理念上,intiUI方法中不适合把数据库的链接和QWidget的初始化,都放到这里面。这些属于对业务逻辑不相关的内容,可以抽离出来,做成公共方法类,数据库连接池,而不是在业务逻辑中处理这些问题。

最后再分享一个传参取值的小tips,在使用字符串拼接的时候,经常会遇到一些占位符,或者变量需要传参的情况,可以使用下面方法2。

代码语言:javascript复制
    def initUI(self, val):
        # 方法1
        sql1 = "select  * from table a where title like %s and a=%s " % (val, val)
        # 方法2
        sql2 = f"select  * from table a where title like %{val}% and a={val}"
        print(sql2)

如果sql的参数的比较多,使用方法2不容易写错位置。

不过还是刚开始那句话,对于初学者来说,先实现后优化,能跑起来的代码就是好代码。

好了,今天就分享到这里,希望对你有用。

我是马拉松程序员,可不至于代码。

0 人点赞