【python零基础入门学习】python进阶篇之OOP - 面向对象的程序设计_基于oop的gui交互的设计与实现python面向对象登录操作

45 阅读4分钟

    print(lb.weapon.name)     print(lb.weapon.strength)


### 子类:


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


 ![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/32a3843f15f94f9493ce1527ce0b6c21~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1771736646&x-signature=P7O7%2Fuqtv8x3UdDrTZaT3fgToGc%3D

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__


### 正则表达式:


#### 匹配单个字符:


 ![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b9d08dbc9ddb4f9490c243d8aa06d9c8~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1771736646&x-signature=F9MefjtUjYiEUxMW2v6FN82fZ%2Fc%3D) 



/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里面  一排~!@#$%^&*()_+  都要转义


#### 匹配一组字符:


 ![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/0402f1b81e7b4f1eaca430929195cbcf~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1771736646&x-signature=Rpa0TV1aEWlRaxMCJqM3iQbhYS0%3D) 




> 

> {M, } 最少M次

> 

> 

> { ,M} 最多M次

> 

> 

> 




#### 其他特殊字符:


 ![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a49146f41c8d4840a9d87b682243a83f~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1771736646&x-signature=ECcGvNyU0t4zsJNu4%2FDcO3sIDkU%3D) 




> 

> <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访问日志:


 ![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/539073e548bf45f38850b598b82d1ef4~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1771736646&x-signature=%2BMer%2FveQA6eiddRo9MFKVZeAAwA%3D) 



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'

img img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

了解详情》docs.qq.com/doc/DSlVlZExWQ0FRSE9H