python--面向对象,,一、面向对象1.面向
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--面向对象
相关内容
- Python——函数,,1、函数定义(1)函
- Python—redis,,一、redis r
- Python -- I/O编程,,I/O编程Input
- Python-函数的参数,,函数的参数此文 出自
- [Python] CondaHTTPError: HTTP 000 CONNECTION FAILED for url,,CondaH
- python中的return中用法总结,,第五题:自己实现一个
- python+django+vue搭建前后端分享项目,,以前一直是做基于
- python实现简单的百度云自动下载,,最近女同让我帮助从
- Python 爬虫 --- urllib,,对于互联网数据,Py
- 黑客需要用到的Python技术?,,Python已经成为
评论关闭