一、装饰器
- 作用就是在函数调用方法不变的情况下,把此函数包装成另一个函数来使用
def auth(func):
def wrapper(*args,**kwargs):
user = raw_input("input_passwd: ")
if user == 'admin':
print "welcome login."
return func(*args,**kwargs)
else:
print "--wrong passwd,access denied---"
return wrapper
#使用语法糖@来装饰函数,运行task前会先调auth
@auth
def task(name,age=33):
print "%s do something...%s." % (name,age)
def task2():
print "do something....2"
def task3():
print "do something....3"
task("run cmd")
二、反射
- 方法的反射
首先定义一些方法 person.py
def run():
print "The person is runing..."
def eat():
print "The person is eating..."
def talk():
print "The person is talking...."
- 通过反射来调用这些方法
import person
def play(action):
return getattr(person,action)
action = play('run')
action()
action = play('eat')
action()
action = play('talk')
action()
- 模块
当httpdownloader和httpsdownloader模块都有一样相同的方法download时,通过__import__
方法导入模块中的方法
def my_downloader(protocl):
downloader = __import__(protocl + "_downloader")
downloader.download()
my_downloader('http')
print "-" * 40
my_downloader('https')
三、异常处理和自定义异常
- 常见python 异常
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
- 自己测试
try:
name = 'leoiceo'
name_list = ['alex','eric','jack']
#print Name
#f = file('test')
#print name_list[4]
raise MyException('aa') # raise 关键字用于引发一个异常
#没有的属性
except ArithmeticError as a:
print a.message
#没有的变量
except NameError,err:
print err
#超界
except IndexError,err:
print err
print 'do sth to make up'
#所有万能异常
except Exception,e:
print '-->some error is do not know',e
else: #如果没有错误就运行
print "--no err happend--"
finally: #不管有没有错误都会运行
print "--no matter has error or not ,this part will run"
print '---do sth else---'
===============================================================
class MyException(Exception): #自定义异常,从Exception类继承
def __init__(self,value):
self.value = value
self.messsage = "MyException error"
四、面向对向编程
- 类的语法
class Person(object):
id_num = 212324234
def __init__(self,name,age): #构造函数
self.name = name #变成实例变量
self.__age = age
self.__gender = 'male' #私有变量
self.__weight = 100
def get_age(self): #私有只读不可改的方法
return self.__age
def __get_a_ax(self): #私有方法
return 'AX'
def choop_woods(self):
tool = self.__get_a_ax()
print "%s is choop on %s" % (self.name,tool)
def run(self):
print "%s is running" % self.name
def speak(self,msg):
print "%s: %s id is %s" % (self.name,msg,self.id_num)
def eat(self):
print "%s is eatting" % self.name
self.speak("eat is happy!")
p1 = Person("leo",23)
p2 = Person("xiaoming",35)
p1.run()
p1.speak('hello, world')
p2.eat()
p2.choop_woods()
类的方法
- 类的方法(类函数)与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。
- 如你有一个类称为MyClass和这个类的一个实例Object。当你调用这个对象的方法Object.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(Object, arg1, arg2)
__init__
对实例初始化
class Dog:
def __init__(self,name):
self.DogName = name #必须赋值self,否则类中其它函数无法调用
def bark(self):
print “Wang! Wang Wang!”
D = Dog(‘Tom’)
D.bark()
- 静太方法和类方法
class MyClass(object):
age = 22
def __init__(self):
self.name = "leo"
def sayhi(self): #必须实例化才能调用
print "----sayhi 1"
@staticmethod #静态方法,跟类没什么关系,不需要实例化即可调用,类的工具包
def sayhi2():
print "----sayhi 2"
@classmethod #不实例化即可以调用,不能访问实例(数据=变量)
def sayhi3(self):
print "----sayhi 3"
@property #将函数变成静态属性
def sayhi4(self):
print "----sayhi 4"
return 'test',self.name
m = MyClass()
print m.sayhi4
#m.sayhi2()
#m.sayhi3()
#MyClass.sayhi3()