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--面向对象的主要内容,如果未能解决你的问题,请参考以下文章

python之路之前没搞明白4面向对象(封装)

Python面向对象学习之八,装饰器

python:第二部分:面向对象:面向对象object orinted

面向面试编程代码片段之GC

Python 面向对象

面向对象编程其实很简单——Python 面向对象(初级篇)