Python 运维开发 学习记录 语言基础(四)

Shell/Python   装饰器   面向对象   静态类  

一、装饰器

  • 作用就是在函数调用方法不变的情况下,把此函数包装成另一个函数来使用
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()