标签:return 计算 code 不同 连接 iges 问题 类继承 str
一、面向对象
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.hhh 19 def hhh(self): 20 return 198 21 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):#继承了Zll 12 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)#执行sql 23 except Exception as e: 24 print(‘sql语句有问题,%s‘%sql) 25 else: 26 self.res = self.cur.fetchall()#获取执行结果 27 return self.res 28 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=1697 19 k,v =i.split(‘=‘) 20 #[vendorId,1697] 21 #data_dict.setdefault(k,v) 22 data_dict[k]=v 23 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)#两次MD5 29 url_str=parse.quote_plus(req_data)#url编码 30 res=my_md5(astr+url_str) 31 return res 32 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]=v 16 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.sign 24 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‘)
标签:return 计算 code 不同 连接 iges 问题 类继承 str
原文地址:https://www.cnblogs.com/yttbk/p/9077884.html