python的继承和重写
1:在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3:Python总是首先查找对应类型的方法,如果它不能在派生类(子类即当前类)中找到对应的方法,它才开始到基类(父类)中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
4:由上面的关系,可以进行方法的重写,在子类中重写父类方法。
如果在继承元组中列了一个以上的类,那么它就被称作”多重继承” 。
抽象类
1.Python本身不提供抽象类和接口机制,要想实现抽象类,可以借助abc模块。ABC是Abstract Base Class的缩写。
2.abc.abstractmethod(function)
表明抽象方法的生成器
class C:
__metaclass__ = ABCMeta
@abstractmethod
def my_abstract_method(self, ...):
表明一个抽象属性
class C:
__metaclass__ = ABCMeta
@abstractproperty
def my_abstract_property(self):
...
上例只是只读属性,如果是读写属性,可以如下:
class C:
__metaclass__ = ABCMeta
def getx(self): ...
def setx(self, value): ...
x = abstractproperty(getx, setx)
父类定义,子类实现
示例:
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def execute(self):
pass
my_base = MyBaseCLass() ##报错,抽象类不能示例化对象
class MyClass(MyBaseClass):
def execute(self):
print 'xx'
my_class = MyClass()
my_class.execute()
两个参数
*args与**kwargs:
当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值。
使用示例:
print args
print kwargs
funtion(1,2,3,a=1,b=2)
注释快捷键:ctrl+/
global:在函数内想使用一个全局变量就要在变量名前加global
__init__(self):初始化方法
python的cmd模块
Python中的cmd模块类型提供了一个创建命令行解析器的框架。简单的来说,可以继承Cmd来创建命令行界面,然后对所有想处理的命令command执行do_command方法。默认情况下,它使用readline来进行交互式操作、命令行编辑和命令完成。
使用cmd创建的命令行解释器循环读取输入的所有行并且解析它们,然后发送命令给一个合适的命令处理器。输入行为解析成两个部分:命令和参数。如果用户输入cmd param,它解释成命令cmd和参数param,然后使用param作为参数调用do_cmd方法。如果do_cmd命令处理器返回真,那么程序会干净的退出,否则会继续等待下一个命令的输入。
关于Cmd的使用,通常都是创建自己的类型,继承于CMd,然后使用Cmd的方法来实现自己的功能,一个超简单的例子:
- from cmd import Cmd
- import sys
- class CmdTest(Cmd):
- def __init__(self): #初始基础类方法
- Cmd.__init__(self)
- def help_hello(self):
- print("输入hello 参数,将执行o_hello方法,输出参数值")
- def do_hello(self,line):
- print("do_hello:",line)
- def help_exit(self): #以help_*开头的为帮助
- print("输入exit退出程序")
- def do_exit(self,line): #以do_*开头为命令
- print("Exit:",line)
- sys.exit()
- if __name__ =="__main__":
- cmd=CmdTest()
- cmd.cmdloop()
运行的结果:
介绍Cmd一些常用的方法:
(1)cmdloop():类似与Tkinter的mainloop,运行Cmd解析器;
(2)onecmd(str):读取输入,并进行处理,通常不需要重载该函数,而是使用更加具体的do_command来执行特定的命名;
(3)emptyline():当输入空行时调用该方法;
(4)default(line):当无法识别输入的command时调用该方法;
(5)completedefault(text,line,begidx,endidx):如果不存在针对的complete_*()方法,那么会调用该函数
(6)precmd(line):命令line解析之前被调用该方法;
(7)postcmd(stop,line):命令line解析之后被调用该方法;
(8)preloop():cmdloop()运行之前调用该方法;
(9)postloop():cmdloop()退出之后调用该方法;
例题:实现四则表达式
1 #!/usr/bin/env python
2 import cmd
3 #coding=utf-8
4 class Cal(cmd.Cmd):
5 promtp = ">>"
6 def do_exit(self,line):
7 """
8 exit system
9 """
10 print line
11 return True
12 def execute(self,line,o):
13 l_s = line.split(' ')
14 a = int(l_s[0])
15 b = int(l_s[1])
16 if o == 'add':
17 return a + b
18 if o == 'sub':
19 return a - b
20 def do_add(self,line):
21 print self.execute(line,'add')
22 def do_sub(self,line):
23 print self.execute(line,'sub')
24 Cal().cmdloop()