您的位置:首页 > 编程语言 > Python开发

Python学习第十九天——多重继承、正则表达式和git的使用

2018-03-19 18:28 671 查看

多重继承

class Father(object):

def __init__(self, name):
self._name = name

def drink(self):
print(self._name + '正在白酒')

class Monk(object):

def __init__(self, nickname):
self._nickname = nickname

def eat_vagetable(self):
print(self._nickname + '正在吃斋')

class Musician(object):

def __init__(self, art_name):
self._art_name = art_name

def play_piano(self):
print(self._art_name + '正在弹钢琴')

def drink(self):
print(self._art_name + '正在喝绿茶')

class Son(Father, Monk, Musician):
#这个顺序很重要,如果多个父类用共同的方法,优先继承前面的

def __init__(self, name, nickname, art_name):
Father.__init__(self, name)
Monk.__init__(self, nickname)
Musician.__init__(self, art_name)

#不要轻易使用多重继承,如果不可避免,最好将它的其他的父类设置成抽象类

def main():
son = Son('王大锤', '智障禅师', '小炮')#多重继承要传多个参数
son.drink()
Musician.drink(son) #通过这种方式可以让son访问不是第一顺序的父类
son.eat_vagetable()
son.play_piano()

if __name__ == '__main__':
main()


#这段代码是对上面代码的优化,在不可避免使用多重继承的情况下,我们最好将除第一个父类以外的
#其他父类写成抽象类
from abc import ABCMeta, abstractmethod

class Father(object):

def __init__(self, name):
self._name = name

def drink(self):
print(self._name + '正在白酒')

class Monk(object, metaclass=ABCMeta):

def __init__(self, nickname):
self._nickname = nickname

@abstractmethod
def eat_vagetable(self):
pass

class Musician(object, metaclass=ABCMeta):

def __init__(self, art_name):
self._art_name = art_name

@abstractmethod
def play_piano(self):
print(self._art_name + '正在弹钢琴')

@abstractmethod
def drink(self):
print(self._art_name + '正在喝绿茶')

class Son(Father, Monk, Musician):
#这个顺序很重要,如果多个父类用共同的方法,优先继承前面的

def __init__(self, name, nickname, art_name):
Father.__init__(self, name)
self._nickname = nickname
self._art_name =art_name

def eat_vagetable(self):
print(self._nickname + '正在吃斋')

def play_piano(self):
print(self._art_name + '正在弹钢琴')

def drink(self):
print(self._art_name + '正在喝绿茶')

#不要轻易使用多重继承,如果不可避免,最好将它的其他的父类设置成抽象类

def main():
son = Son('王大锤', '智障禅师', '小炮')#多重继承要传多个参数
son.drink()
son.eat_vagetable()
son.play_piano()

if __name__ == '__main__':
main()


class A(object):

def foo(self):
print('A\'s foo')#\转义

class B(object):

pass

class C(object):

def foo(self):
print('C\'s foo')

class D(B, C):

pass

def main():
d = D()
d.foo()
#这是一个菱形继承,一种非常糟糕的继承方法,在Python2中,输出的结果会是A的方法,默认的
#深度优先搜索,在Python3中,是广度优先搜索
#如果一个类有多个父类,而多个父类又有多个父类,(菱形继承/钻石继承)
# 那么在搜索属性和方法是搜索的依据是C3算法
#这个是Python3中的一个改进,在此之前搜索的算法是深度优先搜索(DFS)
#不要轻易使用多重继承

if __name__ == '__main__':
main()


# ENIAC 第一台计算机


正则表达式 - 工具 - 字符串的匹配模式

正则表达式学习的网站正则表达式

def is_valid_username(username):
"""
判断用户名是否有效(用户名有字母数字下滑线构成且长度为6-20字符

:param username: 用户名

:return: 有效返回True 无效返回False
"""
if 6 <= len(username) <= 20:
for c in username:
if c  not in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_':
#if not ('0' <= c <= '9' or 'A' <= c <= 'Z' or 'a' <= c <= 'z' or c == '_'):  效果同上
return False
return True
return False


#\w{6,20} 这段代码与上面的函数相同
#re - regular expression
import re
username = 'jackfrued##'
m = re.match(r'\w{6,20}', username)#发现前面是匹配的,后面就不判断了
#x = re.match(r'^\w{6,20}$') 这样表示完整的字符串都匹配
print(m)#返回的是匹配,匹配不成功返回None
print(m.span())#返回匹配的范围
print(m.group()) #返回匹配成功的位置
if m:
print('匹配成功')
else:
print('匹配不成功')


import re
username = '###jackfrued##'
m = re.search(r'\w{6,20}', username)#对所有字符进行匹配,找到匹配的范围
print(m)#返回的是匹配,匹配不成功返回None
print(m.span())#返回匹配的范围
print(m.group()) #返回匹配成功的位置
if m:
print('匹配成功')
else:
print('匹配不成功')


print('a\n')#换行
print('a\\n')#多加\取消转义
print(r'a\n')#原始字符串


#验证QQ的正则表达式
#[1-9]\d{4,11},表示第一个数字是1到9后面跟4到11个数字
import re
user = input('请输入账号')
password = input('请输入密码')
u = re.match(r'^[0-9a-zA-Z_]{6,20}$', user)#只能匹配字母数字下划线
s = re.match(r'[1-9]\d{4,11}', password)
#pattern1 = re.compile(r'^[0-9a-zA-Z_]{6,20}$') 创建一个对象
#u = pattern1.match(user)
#这种写法上在效果上与上面的写法一样,如果这个要在下面多次调用,建议这样写,否则用上面的方法
if not u :
print('请输入正确的账号')
if not s:
print('请输入正确的密码')
if u and s:
print('有效')


请输入账号666666
请输入密码666666
有效


13[0-9]\d{8}|14[5,7]\d{8}|15[012356789]\d{8}|17[678]\d{8}|18[0-9]\d{8}


#www.pythontutor.com 一个辅助代码执行的网站,可以清楚看到代码执行时内存的分配


版本控制

#Subversion 集中式的版本控制
#Git 分布式的版本控制#
#现有的仓库  github 全世界最大的代码集散地
#中国的仓库网站 开源中国 托管代码的平台
# Coding 可以建不限的公开仓库和两个私有仓库
"""
CVS - Concurrent Version System
VSS - Visual Source Safe
都是锁模式
2000年的时候被淘汰

Subversion 合并模式 必须有中央服务器

2005
Git-Linux 可以在本地做服务器 有了中央服务器效果就和Subversion一样
"""
"""
在命令行提示符下输入
版本控制可以放任意文件
git --version检查是否已安装好git
git init 初始化git,设置本地仓库,一个仓库只需要设置一次
git add . (.表示所有文件,注意空格) 将所有文件纳入版本控制
git add 文件名 将制定文件纳入版本控制,并没有真正的提交
git rm 文件名 删除制定文件
git status 显示版本控制状态,查看文件是否
git commit -m '上传原因'   将文件正式纳入版本控制 提交文件
不要输入git commit 后果自负。。一定要加-m和原因
git log 查看所有历史版本
git reset  f3f3d818a2423ed11c98554a264a0717fd44eda1 回到历史版本,后面的是唯一的版本号
git checkout 文件名 拿回一个删除的文件
去Coding上建一个项目
git remote add origin https://git.coding.net/******/******.git git push -u origin master 通过这两段代码关联仓库
如果是要合并项目
需要输入git pull
git 基本操作指南 http://www.bootcss.com/p/git-guide/ 
"""


git指南

"""
熟悉这两个工具
"""
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: