python--面向对象,,一、面向对象1.面向


一、面向对象

1.面向对象的特性
类:class
通俗来说就是一个种类,一个模型
定义类使用class关键字,类名一般我们开发的时候首字母要大写

1 class Person2(object):# 新式类,类名后面加括号,在python3里面经典类和新式类没有任何区别2     pass
1 class Person:# 经典类,class后面加类名,类名首字母大写2     pass

对象:object
指具体的东西,根据模型造出来的东西叫做对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,
就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同。
实例
实例和对象是一样的
实例化
初始化一个类,造了一个对象。把一个类变成一个具体的对象的过程,就是造东西的这个过程叫做实例化。
属性
属性就是类里面的一个变量,有类变量和实例变量,类变量是类在定义的时候就有的,实例变量是在实例化的时候才产生的变量。
这个可以理解为,人是一个类,他的名字、年龄、性别就是它的属性。
方法
方法就是类的功能,也就是定义在类里面的函数。
构造函数
def __init__()
构造函数就是类在实例化的时候执行的函数
类在实例化的时候会自动执行它

以下通过一个示例来说明:

 1 class Person:# 经典类,class后面加类名,类名首字母大写 2     def __init__(self,name):#构造函数,非必须的,可写可不写 3         self.name=name 4         self.nose=1# 类里面的变量就叫属性 5         self.face=2 6         self.head=1 7         self.wing=2 8  9     def driver(self):#方法,只要带了self的就是实例方法,必须实例化后才能调用10         print(‘%s开卡丁车!‘%self.name)11         self.eat()#调用类里面的函数12     def fly(self):13         print(‘%s在飞....‘%self.name)#获取类里面的变量14     def eat(self):15         print(‘%s吃火锅‘%self.name)16 17 #类在用的时候,首先必须实例化18 yy = Person(name=‘cherry‘)#实例化,类名加上括号就是实例化19 yy.eat()#调用实例方法20 print(yy.nose)#可以直接打印出它的属性

类方法
1、不用实例化就可以直接调用。
2、它可以通过cls使用类变量
3、它不能调用这个类里面的其他实例方法和实例变量

 1 class Baby(): 2     def __init__(self,name): 3         print(‘self的内存地址:‘,id(self)) 4         self.name=name 5         #self代表的就是实例化之后的对象(本类对象) 6         #因为函数里面的变量都是局部变量,出了函数就不能用了, 7         #用self给对象绑定了之后,就可以self.xx随便用了 8         self.money=5000 9         self.sex=‘女‘10     country = ‘china‘#类变量,不管是否实例化都能用,公共的变量,每个对象都能用11     def my(self):12         self.name=‘张三‘13 14     def cry(self):#只要带了self的就是实例方法,必须实例化后才能调用15         print(‘哇哇哇‘)16 #属性方法17     #看起来像属性的一个方法18     @property#加上这个,调用的时候就不需要括号了b.hhh19     def hhh(self):20         return 19821 22     @classmethod#类方法23     def xm(cls):#cls代表的就是Baby类24         print(cls.country)25         print(‘我是类方法‘)26         # print(cls.name)#name是实例方法,所以调用会报错27         # print(cls.cry())28 29     @staticmethod#静态方法就是一个普通函数,只不过是写在类里面而已,它用不了类变量,类方法,实例变量,实例方法30     def xh():#调用也是Baby.xh()31         print(‘这个是静态方法,它和一个没写在类里面的函数一样‘)
1 #1.不实例化,直接用类名调用这个xm方法2 #2.实例化之后,在通过实例化之后的对象调用xm方法,看看可以不3 Baby.xm()#调用方法一4 5 bb = Baby()#调用方法二6 bb.xm()7 #以上两种调用方法结果是一样的8 #不想实例化的时候,就可以定义成类方法
1 Baby.country=‘USA‘#类变量是可以直接通过类名.xx来进行修改的2 dcg = Baby()3 dcg.country=‘Japan‘4 print(dcg.country)

继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承。比如说你继承了你父亲的姓

 1 class Father(object): 2     def __init__(self): 3         self.money = 10000 4         self.house=‘3环20套‘ 5     def sing(self): 6         print(‘唱歌‘) 7     def dance(self): 8         print(‘跳广场舞‘) 9     def lm(self):10         print(‘找朋友‘)11 class Son(Father):#继承了Zll12     def dance(self):13         print(‘跳霹雳舞‘)14 15 A =Son()16 print(A.house)17 A.dance()

运行结果
技术分享图片

下面将操作数据库用面向对象实现

 1 import pymysql 2 class MyDb(object): 3     def __del__(self):#析构函数,是这个实类被销毁的时候才会执行 4         self.cur.close() 5         self.coon.close() 6         print(‘over...‘) 7     def __init__(self, 8                  host,user,passwd,db, 9                  port=3306,charset=‘utf8‘):10         try:11             self.coon =pymysql.connect(12                 host=host,user=user,passwd=passwd,13                 port=port,charset=charset,db=db,autocommit=True,#autocommit=True是自动提交14             )#连接数据库15         except Exception as e:16             print(‘数据库连接失败!%s‘%e)17         else:18             self.cur=self.coon.cursor(cursor=pymysql.cursors.DictCursor)#建立游标,返回字典19 20     def ex_sql(self,sql):21         try:22             self.cur.execute(sql)#执行sql23         except Exception as e:24             print(‘sql语句有问题,%s‘%sql)25         else:26             self.res = self.cur.fetchall()#获取执行结果27             return self.res28 29 my = MyDb(‘118.24.3.40‘,‘jxz‘,‘123456‘,‘jxz‘)30 my.ex_sql(‘select * from stu;‘)31 print(my.res)32 print(‘我是最后一行代码...‘)

小练习
需求:

A、输入数据:
1、请求数据:
vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0
2:商家编码:
1697

B、计算规则:
1、将商家编码(vendorId)1697进行两次MD5加密得到一个字符串 Astr:09B764965CE4E92BED8BD3140E22D5CF
2、将请求数据
vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0
进行urlDecode处理(编码格式为utf-8)得到一个字符串urlDecodeStr:
vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0
3、urlDecodeStr + Astr 拼接得到一个待加密的字符串 beforeMD5
vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E009B764965CE4E92BED8BD3140E22D5CF
然后将 beforeMD5字符串进行加密得到最终的签名:
6F811B63B11D92BA4A359E6DC98EEE31

C、分析:

1、请求数据获取到
2、提取到商家编码
3、将商家编码进程2次md5 得到astr
4、再将请求数据进行一次urldecode,urlstr
5、astr+url_str MD5
方法一

 1 from urllib import parse 2 url = ‘http://www.baidu.com?query=python基础教程‘ 3 url_str =parse.quote_plus(url)#url编码 4 baidu_url = ‘https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=monline_3_dg&wd=python%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B&rsv_pq=edf343e300027526&rsv_t=e5f46Mcz6dVcF83j9SRbKxD%2BkeQjVcxFtCWolFhtznvhCVFW9Z8h%2BrQXVIvAsWtTFFO7&rqlang=cn&rsv_enter=1&rsv_sug3=2&rsv_sug1=1&rsv_sug7=100‘ 5 # print(parse.unquote_plus(baidu_url))#url解码 6  7 import hashlib 8 def my_md5(s): 9     md = hashlib.md5()10     md.update(s.encode())11     return md.hexdigest()12 13 def get_vendorid(req_data):14     sub_str=req_data.split(‘&‘)15     #[‘vendorId=1697‘, ‘posCode=pos006‘, ‘ip=127.0.0.1‘, ‘posVersion=2.1.1.1.1‘]16     data_dict={}17     for i in sub_str:18         #vendorId=169719         k,v =i.split(‘=‘)20         #[vendorId,1697]21         #data_dict.setdefault(k,v)22         data_dict[k]=v23     return data_dict.get(‘vendorId‘)24 25 def sign(req_data):26     verid=get_vendorid(req_data)#调用获取vendorId函数27     first = my_md5(verid)28     astr= my_md5(first)#两次MD529     url_str=parse.quote_plus(req_data)#url编码30     res=my_md5(astr+url_str)31     return res32 33 s=‘vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0‘34 print(sign(s))

方法二

 1 class Sign(object): 2     def __init__(self,req_data): 3         self.req_data = req_data#这写了self的话,在其他的函数里面也可以用self.xx 4         self.get_verid() 5         self.get_sign() 6     def md5(self,s): 7         md = hashlib.md5() 8         md.update(s.encode()) 9         return md.hexdigest()10     def get_verid(self):11         data_dict={}12         sub_list=self.req_data.split(‘&‘)13         for i in sub_list:14             k,v =i.split(‘=‘)15             data_dict[k]=v16         self.verid = data_dict.get(‘vendorId‘)17     def get_sign(self):18         self.get_verid()19         first =self.md5(self.verid)20         astr = self.md5(first)21         url_str=parse.quote_plus(self.req_data)22         self.sign = self.md5(astr+url_str)23         return self.sign24 25 s=‘vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0‘26 abc = Sign(s)27 print(abc.sign)28 print(‘我是sign‘)

python--面向对象

评论关闭