python--面向对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python--面向对象相关的知识,希望对你有一定的参考价值。
一、面向对象
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\')
以上是关于python--面向对象的主要内容,如果未能解决你的问题,请参考以下文章