print(lb.weapon.name) print(lb.weapon.strength)
### 子类:
* - 两个类有很多一样的地方
* - 某一个类与另一个类又有不同
* - 子类可以继承父类的方法
* - 子类可以有多个父类
* - 父子类有同名方法,查找顺序是自下向上,自左向右,先找到的执行

class Role: def init(self,nm,wp):#self是约定俗成, 定义角色用 self.name = nm self.weapon = wp
def show_me(self): print('我是%s,我使用%s' % (self.name,self.weapon))
def speak(self,words): print(words)
class Warrior(Role): #括号中是父类,也叫基类 pass
class Mage(Role): def fly(self): print('i can fly.')
if name == 'main': #实例化时,子类中没有__init__方法,将会寻找父类的相关方法 lb = Warrior('吕布','方天画戟') km = Mage('孔明','扇子') lb.show_me() km.show_me() km.fly() #lb.fly()这个没有fly功能
class A: def func1(self): print('a func')
def func4(self): print('#####4#####')
class B: def func2(self): print('b func')
def func4(self): print('*********')
class C(B,A): def func3(self): print('c func')
# def func4(self): # print('^^^^^^^^')
if name == 'main': c1 = C() c1.func1() c1.func2() c1.func3() c1.func4()
自下向上,自左向右------先C-B-A, 之后C(B,A)
### 魔法方法:
特殊方法:
* \_\_init\_\_ :实例化类实例时默认会调用的方法
* \_\_str\_\_:打印/显示实例时调用方法以及 返回字符串
* \_\_call\_\_: 用于创建可调用的实例
class Book: def init(self,title,author): self.title = title self.author = author
def str(self): # 打印实例时,执行此方法 return '《%s》' % self.title
def call(self): print('《%s》是%s编著的' % (self.title,self.author))
if name == 'main': pybook = Book('Python核心编程','韦斯利')#调用 init print(pybook) #调用__str__ pybook() #调用__call__
### 正则表达式:
#### 匹配单个字符:

/t.m /t[a-z]m /t[0-10]m 含有0和1 /t[0-9amo]m /t[-a1]m 减号放两边 /t[^0-9]m 取反 不要数字0-9 /t[0-9^]m 0-9以及^号 /t\dm 相当于 [0-9]
\w 任意数字字母 \W 取反 不是数字字母 \s 匹配空白字符 相当于 \r\v\f\t\n \S 取反 不是空白字符
在vim里面 一排~!@#$%^&*()_+ 都要转义
#### 匹配一组字符:

>
> {M, } 最少M次
>
>
> { ,M} 最多M次
>
>
>
#### 其他特殊字符:

>
> <tom> 只匹配tom 或者\btom\b
>
>
>
#### 例子:
##### 为mac地址加:
* 找到MAC地址
* 每两个数字分一组
* 中间以:分隔开
>
> 192.168.1.1 0000ca001256
>
>
> :%s/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)$/\1:\2:\3:\4:\5:\6/ ----%s// 全文替换 在vim中
>
>
>
#### re模块:
import re #在food的开头匹配f... 匹配到返回匹配对象,匹配不到则返回None re.match('f..','food') <_sre.SRE_Match object; span=(0, 3), match='foo'> re.match('f..','seafood') print(re.match('f..','seafood')) None
#search在字符串中匹配正则,匹配到返回匹配对象
re.search('f..','seafood') <_sre.SRE_Match object; span=(3, 6), match='foo'> m = re.search('f..','seafood') m.group() 'foo' #匹配对象的group方法返回匹配到的内容
re.search('f..','seafood is food') #返回所有匹配 findall re.findall('f..','seafood is food') ['foo', 'foo']
#返回匹配对象构成的生成器
re.finditer('f..','seafood is food') <callable_iterator object at 0x7f8a055fd2b0> list(re.finditer('f..','seafood is food')) [<_sre.SRE_Match object; span=(3, 6), match='foo'>, <_sre.SRE_Match object; span=(11, 14), match='foo'>] for m in re.finditer('f..','seafood is food'): ... m.group() ... 'foo' 'foo'
切分: #以-或者. 作为分隔符切割字符串
re.split('-|.','hello-world-china.com.cn') ['hello', 'world', 'china', 'com', 'cn']
#把X替换成tedu
re.sub('X','tedu','X web site is X.cn') 'tedu web site is tedu.cn'
为了提升匹配效率,最好将正则表达式先编译
patt = re.compile('f..') patt.match('food') <_sre.SRE_Match object; span=(0, 3), match='foo'> patt.search('seafood') <_sre.SRE_Match object; span=(3, 6), match='foo'> m = patt.search('seafood') m.group() 'foo'
##### 例子:
###### 分析apache访问日志:

import re
def count_patt(fname,patt): cpatt = re.compile(patt) #为了更好的执行效率,把模式编译 patt_dict = {} #把结果保存到字典 with open(fname) as fobj: for line in fobj: m = cpatt.search(line) #在一行中匹配模式 if m: #如果m不是None,非空为真 key = m.group() patt_dict[key] = patt_dict.get(key,0) + 1 # if key not in patt_dict: # patt_dict[key] = 1 # else: # patt_dictp[key] += 1 return patt_dict
if name == 'main': fname = 'access_log' ip = '^(\d+.){3}\d+' br = 'Chrome|MSIE|Firefox' result1 = count_patt(fname, ip) result2 = count_patt(fname, br) print(result1) print(result2)
#####################class import re
class CountPatt: def count_patt(self, fname,patt): cpatt = re.compile(patt) #为了更好的执行效率,把模式编译 patt_dict = {} #把结果保存到字典 with open(fname) as fobj: for line in fobj: m = cpatt.search(line) #在一行中匹配模式 if m: #如果m不是None,非空为真 key = m.group() patt_dict[key] = patt_dict.get(key,0) + 1 # if key not in patt_dict: # patt_dict[key] = 1 # else: # patt_dictp[key] += 1 return patt_dict
if name == 'main': fname = 'access_log' ip = '^(\d+.){3}\d+' br = 'Chrome|MSIE|Firefox' wl = 'Windows|Linux' cp = CountPatt() result = cp.count_patt(fname,ip) result2 = cp.count_patt(fname, br) print(result) print(result2) # result1 = count_patt(fname, ip) # result2 = count_patt(fname, br) # print(result1) # print(result2)
##################class + 绑定文件 import re
class CountPatt: def init(self,fname): self.fname = fname
def count_patt(self, patt): cpatt = re.compile(patt) #为了更好的执行效率,把模式编译 patt_dict = {} #把结果保存到字典 with open(self.fname) as fobj: for line in fobj: m = cpatt.search(line) #在一行中匹配模式 if m: #如果m不是None,非空为真 key = m.group() patt_dict[key] = patt_dict.get(key,0) + 1 # if key not in patt_dict: # patt_dict[key] = 1 # else: # patt_dictp[key] += 1 return patt_dict
if name == 'main': fname = 'access_log' ip = '^(\d+.){3}\d+' br = 'Chrome|MSIE|Firefox'
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
了解详情》docs.qq.com/doc/DSlVlZExWQ0FRSE9H