创建程序,要求如下:
由于游戏角色和武器都由类实现,而这个两个类又完全不同,所以可以通过组合来实现。将武器类的一个实例作为游戏人物的一个属性。
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
- [root@localhost day07]# vim game_role.py
- class Weapon:
- def __init__(self, wname, strength):
- self.wname = wname
- self.strength = strength
- class Warrior:
- def __init__(self, name, weapon):
- self.name = name
- self.weapon = weapon
- def speak(self, words):
- print("I'm %s, %s" % (self.name, words))
- def show_me(self):
- print("我是%s, 我是一个战士。我用的武器是%s" % (self.name, self.weapon.wname))
- if __name__ == '__main__':
- blade = Weapon('青龙偃月刀', 100)
- print(blade.wname, blade.strength)
- gy = Warrior('关羽', blade)
- gy.show_me()
- cz = Weapon('禅杖', 100)
- lzs = Warrior('鲁智深', cz)
- lzs.show_me()
步骤二:测试脚本执行
- [root@localhost day07]# python3 game_role.py
- 青龙偃月刀 100
- 我是关羽, 我是一个战士。我用的武器是青龙偃月刀
- 我是鲁智深, 我是一个战士。我用的武器是禅杖
创建books.py文件,实现以下目标:
创建一个类,类中创建3种魔法方法:
1.__init__方法:__init__方法用于初始化实例属性,创建对象后会自动调用__init__方法,属于构造器方法,此处初始化了书名及作者两个属性
2.__str__方法:创建对象后,打印实例对象pybook,返回书名,打印出书名
3.__call__方法:创建对象后,可以像调用函数一样调用该方法,模拟函数的行为,打印出书名及作者
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
- [root@localhost day07] # vim books.py
- #!/usr/bin/env python3
- class Book:
- def __init__(self, title, author):
- self.title = title
- self.author = author
- def __str__(self):
- return '<Book: %s>' % self.title
- def __call__(self):
- print('《%s》 is written by %s.' % (self.title, self.author))
- if __name__ == '__main__':
- pybook = Book('Core Python', 'Weysley')
- print(pybook) # 调用__str__
- pybook() # 调用__call__
步骤二:测试脚本执行
- [root@localhost day07]# python3 books.py
- <Book: Core Python>
- 《Core Python》 is written by Weysley.
编写count_patt.py脚本,实现一个apche日志分析脚本:
collections是python内建的一个集合模块,模块中提供了许多有用的集合类,其中counter类 是一个简单的计数器,以字典的键值对形式储存,其中搜索的元素作为键,出现的次数作为值
实现过程:
1.实例化一个计数器
2.实例化正则表达式
3.将文件以对象形式打开
4.通过正则表达式查找文件每一行
5.如果找到结果
6.将结果添加到计数器,通过update方法更新原有数据
7.返回计数器
8.将文件地址和正则表达式作为实参传递给函数
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
- [root@localhost day08]# vim count_patt.py
- #!/usr/bin/env python3
- import re
- import collections
- #fname 文件地址 patt 正则表达式
- def count_patt(fname,patt):
- counter = collections.Counter()
- cpatt = re.compile(patt)
- with open(fname) as fobj:
- for line in fobj:
- m = cpatt.search(line)
- if m:
- counter.update([m.group()])
- return counter
- if __name__ == "__main__":
- fname = "access_log.txt"
- ip_patt = "^(\d+\.){3}\d+"
- a = count_patt(fname,ip_patt)
- print(a)
- br_patt = "Firefox|MSIE|Chrome"
- b = count_patt(fname,br_patt)
- print(b)
实现此案例还可通过面向对象方式实现:
实现过程:
1.创建类CountPatt
2.定义构造方法 创建正则对象
3.定义类方法
4.创建计数器对象
5.打开文本文件
6.通过正则表达式查找文件每一行
7.如果找到结果
8.将结果添加到计数器,通过update方法更新原有数据
9.返回计数器
10.将文件地址和正则表达式作为实参传递给函数
- [root@localhost day08]# vim count_patt2.py
- #!/usr/bin/env python3
- import re
- import collections
- import re
- import collections
- class CountPatt:
- def __init__(self,patt):
- self.cpatt = re.compile(patt)
- def count_patt(self,fname):
- counter = collections.Counter()
- with open(fname) as fobj:
- for line in fobj:
- m = self.cpatt.search(line)
- if m:
- counter.update([m.group()])
- return counter
- if __name__ == "__main__":
- fname = "access_log.txt"
- ip_patt = "^(\d+\.){3}\d+"
- br_patt = "Firefox|MSIE|Chrome"
- ip = CountPatt(ip_patt)
- print(ip.count_patt(fname))
- br = CountPatt(br_patt)
- print(br.count_patt(fname))
步骤二:测试脚本执行
- [root@localhost day08]# python3 count_patt.py
- Counter({‘172.40.0.54’:391,‘172.40.50.116’:244,‘201.1.1.254’:173,‘127.0.0.1’:121,‘201.1.2.254’:119})
- Counter({‘Firefox’:870,‘MSIE’:391,‘Chrome’:24})
- [root@localhost day08]# python3 count_patt2.py
- Counter({‘172.40.0.54’:391,‘172.40.50.116’:244,‘201.1.1.254’:173,‘127.0.0.1’:121,‘201.1.2.254’:119})
- Counter({‘Firefox’:870,‘MSIE’:391,‘Chrome’:24})