python面向对象示例

python面向对象示例

  1. 类是抽象的模板,而实例是根据类创建出来的具体的对象。
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

  1. 继承和多态
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

  1. 锁的作用是保证多线程的同步操作
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

  1. 创建线程
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.

  1. 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))
  1. 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)

  1. 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})

  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)
  1. 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐江小鱼

知识创造财富,期待您的慷慨解囊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值