Python入门——高级

Python入门

2.1 面向对象

创建类文件employee.py

class Employee:
    '所有员工的基类‘
    empCount = 0
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Employee.empCount += 1
        def displayCount(self):
            print "Total Employee : ", Employee.empCount 
        def displayEmployee(self):
            print "Name : ",self.name, ", Salary: ", self.salary

init()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法。

self:代表类的实例,self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。

self代表类的实例,而非类
在这里插入图片描述

添加,删除,修改类的属性

e1.age = 22 # 添加属性del e1.age # 删除age属性

getattr(obj, name):访问对象的属性

setattr(obj, name, value):添加属性name值为value

hasattr(obj, name):如果存在属性name就返回true

delattr(obj, name):删除属性

类的继承

语法:

class ChildClass(ParentClass1[ , ParentClass2……]):  ……

注意:

  1. 在继承中基类的构造方法不会被自动调用,它需要在其派生类的构造中专门调用。

  2. 在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量

class Child(Parent):
    def __init__(self):
        print "调用子类构造方法"
        Parent.__init__(self)

运算符重载

#!/bin/python
# coding=utf-8
class Vector:    
 
   def __init__(self, a, b):
       self.a = a
       self.b = b
   
   def __str__(self):
       return "Vector ( %d, %d)" % (self.a, self.b)

   def __add__(self, other):
       return Vector(self.a + other.a, self.b + other.b)
   
v1 = Vector(6, 9)
v2 = Vector(2, 5)
print v1 + v2

属性与方法

私有属性:两个下划线开头,声明该属性为私有,不能在类外被使用或直接访问。

类方法:必须包含参数self,且为第一个参数。

私有方法:两个下划线开头,声明该方法为私有方法,不能在类外调用。

Python不允许实例化的类访问私有数据,但可以使用object._className__attrName访问属性。

单下划线,双下划线,头尾双下划线说明:

foo:定义的是特殊方法,一般是系统定义名字,类似__init__()之类的。

_foo:以单下划线开头的表示的是protected类型的变量,即保护类型。只能允许其本身与子类进行访问,不能用于from module import *

__foo:双下划线表示私有类型的变量,只能是允许这个类本身进行访问了。

2.2 正则表达式

re模块使python拥有全部的正则表达式功能。

2.2.1 re.match函数

re.match()尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话。match()就返回none。

re.match(pattern, string, flags=0)

参数说明:

  • pattern:匹配的正则表达式

  • string:要匹配的字符串

  • flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等。

匹配成功re.match()方法返回一个匹配的对象,否则返回none。

group(num = 0):匹配的整个表达式的字符串,group()可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

匹配对象方法描述
group(num = 0)匹配的整个表达式的字符串,group()可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
group()返回一个包含所有小组字符串的元组

2.2.2 re.search函数

re.search()会在字符串内查找模式匹配,直到找到第一个匹配。

re.search(pattern, string, flags=0)

match和search的区别

​ match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回none,而search匹配整个字符串,直到找到一个匹配。

2.2.3 检索和替换

python的re模块提供了sub用于替换字符串中的匹配项。

re.sub(pattern, repl, string, max=0)

max是模式匹配后替换的最大次数,max必须是非负整数。缺省值是0表示替换所有的匹配。

2.3 操作mysql数据库

关于Python操作MySQL的增删查改操作,具体请看链接Python操作MySQL:https://blog.csdn.net/lmchhh/article/details/107602252

2.4 网络编程

python提供了两个级别访问的网络权限:

(1) 低级别的网络服务支持基本的socket,它提供了标准的BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。

(2) 高级别的网络服务模块SocketServer,它提供了服务器中心类,可以简化网络服务器的开发。

2.4.1 socket()函数

语法:

socket.socket([family [, type]]

family:套接字家族可以使AF_UNIX或者AF_INET

type:套接字类型可以根据是面向连接的还是非连接,分为SOCK_STREAM或SOCK_DGRAM

2.4.2 socket对象内建方法

服务器端套接字:

bind(host,port):绑定地址到套接字

listen():开始TCP监听

accept():被动接受TCP客户端连接

客户端套接字:

connect():主动初始化TCP服务器连接

connect_ex():connect扩展版本,出错时返回错误码,而不是抛出异常。

公共套接字函数:

recv(bufsize):接收TCP数据,bufsize指定要接收到最大数据量。

send():发送TCP数据

示例:

Server

#!/usr/bin/python
# coding=utf-8
import socket

s = socket.socket() #创建socket对象
host = socket.gethostname() #获取本地主机名
port = 12345    #设置端口
s.bind((host, port))    #绑定端口

s.listen(5) #等待客户端连接

while True:
    c, addr = s.accept()
    print "连接地址:", addr
    c.send("欢迎访问......")
    c.close()

client:

#!/usr/bin/python
# coding=utf-8

import socket

s = socket.socket()
host = socket.gethostname()
port = 12345
s.connect((host, port))
print s.recv(1024)
s.close()

2.4.3 使用SMTP发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件到规则,由它来控制信件到中转方式。

​ Python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行类简单的封装。

语法:

smtpObj = smtplib.SMTP( [host [ , port, hostname] ])

host:SMTP服务器主机,可以指定主机的IP地址或者域名,可选参数

port:一般情况下SMTP端口号为25

hostname:如果SMTP在本机上,只需要指定服务器地址为localhost即可。

Python的SMTP对象使用sendmail方法发送邮件。

语法:

SMTP.sendmail(from_addr, to_addr, msg)

from_addr:邮件发送者地址

to_addrs:字符串列表,邮件发送地址

msg:发送消息

具体操作可查看另一条比较详细的博客 https://blog.csdn.net/lmchhh/article/details/107586112

2.5 多线程

python中使用线程有两种方式:函数或者类来包装线程对象

函数式:

python调用thread模块中的start_new_thread()函数来产生新线程。

语法:

thread.start_new_thread(function, args[, kwargs])

function:线程函数

args:传递给线程函数的参数,它必须是一个tuple类型

kwargs:可选参数

示例:

# coding=utf-8

import thread
import time

def print_time(threadname, delay):
   count = 0
   while count < 5:
       time.sleep(delay)
       count += 1
       print "%s: %s " % (threadname, time.ctime(time.time()))

try:
   thread.start_new_thread(print_time, ("thread-1", 2,))
   thread.start_new_thread(print_time, ("thread-2", 4,))
except:
   print "Error: ....."

while 1:
   pass

类包装式:

使用Threading模块创建线程,直接从threading.Thread继承,然后重写__init__方法和run方法

示例:

# coding=utf-8

import threading
import time

exitFlag = 0

class myThread(threading.Thread):
    def __init__(self, threadID, name):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name

    def run(self):
        print "Starting " + self.name
        print_time(self.name, 5)
        print "Exiting " + self.name

def print_time(threadname, delay):
    count = 0
    while count < 5:
        time.sleep(delay)
        count += 1
        print "%s: %s " % (threadname, time.ctime(time.time()))

thread1 = myThread(1, "thread-1")
thread2 = myThread(2, "thread-2")

thread1.start()
thread2.start()

print "EXIT"

执行结果:

Starting thread-1
Starting thread-2
 EXIT
thread-1: Tue Jul 21 10:36:22 2020
 thread-2: Tue Jul 21 10:36:22 2020
thread-2: Tue Jul 21 10:36:27 2020
 thread-1: Tue Jul 21 10:36:27 2020
thread-2: Tue Jul 21 10:36:32 2020
 thread-1: Tue Jul 21 10:36:32 2020
thread-1: Tue Jul 21 10:36:37 2020
 thread-2: Tue Jul 21 10:36:37 2020
thread-1: Tue Jul 21 10:36:42 2020
 Exiting thread-1
thread-2: Tue Jul 21 10:36:42 2020
Exiting thread-2

线程同步

使用Thread对象的Lock和RLock可以实现简单的线程同步,这两个对象都有acquire方法和release方法。

ef run(self):
        print "Starting " + self.name
        threadLock.acquire()
        print_time(self.name, 5)
        threadLock.release()
        print "Exiting " + self.name

2.6 JSON

使用json需要导入json库:

import json
函数描述
json.dumps()将python对象编码成json格式
json.loads()将已编码的json字符串解码为python对象
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值