python面向对象示例
- 类是抽象的模板,而实例是根据类创建出来的具体的对象。
class Student(object):
# 第一个参数永远是self,表示创建的实例本身,可以把各种属性绑定到self
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s: %s' % (self.name, self.score))
bart = Student('Bart Simpson', 50)
print(bart, Student)
bart.print_score()
结果:
<main.Student object at 0x000001F3B788A0E0> <class ‘main.Student’>
Bart Simpson: 50
- 继承和多态
class Animal(object):
def run(self):
print('Animal is running...')
class Dog(Animal):
def run(self):
print('Dog is running...')
class Cat(Animal):
pass
dog = Dog()
dog.run()
isinstance(dog, Dog)
def run_twice(animal):
animal.run()
animal.run()
print(run_twice(Animal()))
print(run_twice(Dog()))
结果:
Dog is running…
True
Animal is running…
Animal is running…
None
Dog is running…
Dog is running…
None
- 锁的作用是保证多线程的同步操作
import threading
balance = 0
lock = threading.Lock()
def change_it(n):
global balance
balance = balance + n
balance = balance - n
def run_thread(n):
for i in range(10000):
lock.acquire()
try:
change_it(n)
finally:
lock.release()
t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)
结果:
0
- 创建线程
import time, threading
def loop():
print('Thread %s is running...' % threading.current_thread().name)
n = 0
while n < 5:
n += 1
print('Thread %s >>> %s' % (threading.current_thread().name, n))
time.sleep(1)
print('Thread %s ended.' % (threading.current_thread().name))
print('Thread %s is running...' % threading.current_thread().name)
t = threading.Thread(target=loop, name='LoopThread')
t.start()
t.join()
print('Thread %s ended.' % (threading.current_thread().name))
结果:
Thread MainThread is running…
Thread LoopThread is running…
Thread LoopThread >>> 1
Thread LoopThread >>> 2
Thread LoopThread >>> 3
Thread LoopThread >>> 4
Thread LoopThread >>> 5
Thread LoopThread ended.
Thread MainThread ended.
- itertools库的使用
import itertools
# count()会创建一个无限的迭代器,执行会导致死机
natuals = itertools.count(1)
for n in natuals:
print(n)
# cycle会把传入的一个序列无限重复下去
cs = itertools.cycle('ABC')
for c in cs:
print(c)
# repeat负责把一个元素无限重复下去,第二个参数可以指定重复次数
ns = itertools.repeat('A', 3)
print([x for x in ns])
# chain可以把一组迭代对象串联起来形成一个更大的迭代器
print([c for c in itertools.chain('ABC', 'XYZ')])
# groupby把迭代器中相邻的重复元素挑出来放在一起
for key, group in itertools.groupby('AAABBBCCAAA'):
print(key, list(group))
- struct库的使用
import struct
# python中一个32位无符号整数变成字节,也就是4个长度的字节
n = 10240099
b1 = (n & 0xff000000) >> 24
b2 = (n & 0xff0000) >> 16
b3 = (n & 0xff00) >> 8
b4 = n & 0xff
bs = bytes([b1, b2, b3, b4])
print(bs)
# struct解决bytes和其他二进制数据类型转换
print(struct.pack('>I', 10240099))
# 第一个参数时处理指令,>表示字节顺序时大端,也就是网络序,I表示4字节无符号整数,H表示2字节无符号整数
print(struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80'))
结果:
b’\x00\x9c@c’
b’\x00\x9c@c’
(4042322160, 32896)
- collections库中数据结构的使用
from collections import namedtuple, deque, defaultdict, OrderedDict, Counter
# namedtuple创建一个自定义元组对象,并且规定了元素的个数
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p.x, ',', p.y)
print(isinstance(p, Point))
print(isinstance(p, tuple))
# deque双向列表, 适用于队列和栈
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
print(q)
# 使用dict时,如果引用的key不存在会抛出KeyError,可以返回一个默认的词典解决
dd = defaultdict(lambda: 'N/A')
# 默认值是调用函数返回的,而函数在创建defaultdict对象时传入
dd['key1'] = 'abc'
print(dd['key1'])
print(dd['key2'])
# OrderedDict可以保持key的顺序
d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d)
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od)
od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
print(od.keys())
# Counter简单的计数器
c = Counter()
for ch in 'programming':
c[ch] = c[ch] + 1
print(c)
结果:
1 , 2
True
True
deque([‘y’, ‘a’, ‘b’, ‘c’, ‘x’])
abc
N/A
{‘a’: 1, ‘b’: 2, ‘c’: 3}
OrderedDict([(‘a’, 1), (‘b’, 2), (‘c’, 3)])
odict_keys([‘z’, ‘y’, ‘x’])
Counter({‘r’: 2, ‘g’: 2, ‘m’: 2, ‘p’: 1, ‘o’: 1, ‘a’: 1, ‘i’: 1, ‘n’: 1})
- 使用OrderedDict实现一个FIFO的dict
class LastUpdateOrderedDict(OrderedDict):
def __init__(self, capacity):
super(LastUpdateOrderedDict, self).__init__()
self._capacity = capacity
def __setitem__(self, key, value):
containsKey = 1 if key in self else 0
if len(self) - containsKey >= self._capacity:
last = self.popitem(last=False)
print('remove:', last)
if containsKey:
del self[key]
print('set:', (key, value))
else:
print('add:', (key, value))
OrderedDict.__setitem__(self, key, value)
- request、parse库的使用
from urllib import request, parse
with request.urlopen('http://www.dba.cn/book/python3/ChangYongNeiJianMoKuai/URLLIB.html') as f:
data = f.read()
print('Status:', f.status, f.reason)
for k, v in f.getheaders():
print('%s: %s' % (k, v))
print('Data:', data.decode('utf-8'))
# 模拟访问豆瓣移动版
req = request.Request('http://www.douban.com/')
req.add_header('User-Agent', '从浏览器获取')
with request.urlopen(req) as f:
print('Status:', f.status, f.reason)
for k, v in f.getheaders():
print('%s: %s' % (k, v))
print('Data:', f.read().decode('utf-8'))
# 以POST方式发送请求
print('Login to weibo.cn...')
email = input('Email:')
passwd = input('Password:')
login_data = parse.urlencode([
('username', email),
('password', passwd),
('entry', 'mweibo'),
('client_id', ''),
('savestate', '1'),
('ec', ''),
('pagerefer', 'https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F')
])
req = request.Request('https://passport.weibo.cn/sso/login')
req.add_header('Origin', 'https://passport.weibo.cn')
req.add_header('User-Agent', '从浏览器获取')
req.add_header('referer', 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F')
with request.urlopen(req, data=login_data.encode('utf-8')) as f:
print('Status:', f.status, f.reason)
for k, v in f.getheaders():
print('%s: %s' % (k, v))
print('Data:', f.read().decode('utf-8'))
# 可以通过代理访问网站
proxy_handler = request.ProxyHandler({'http': 'http://www.example.com:3128/'})
proxy_auth_handler = request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')
opener = request.build_opener(proxy_handler, proxy_auth_handler)
with opener.open('http://www.example.com/login.html') as f:
pass