|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
知识点:
1.issubclass(class,classinfo)
#用于检查参数class是否是类型参数classinof的子类。注意:1.这种检查属于非严格型的检查,一个类会被认为是自身的子类。2.classinfo可以是类对象组成的元组,只要class是其中任何一个候选的类对象子类,则返回True。
参数:
class--类对象。
classinfo--类或者类对象组成的元组。
返回值:True或者False。
例:
- >>> class A:
- pass
- >>> class B(A):
- pass
- >>> class C:
- pass
- >>> issubclass(B,A)
- True
- >>> issubclass(B,B)
- True
- >>> issubclass(C,A)
- False
- >>> issubclass(B,(A,C)) #只要A和C中有一个是B的父类,则返回True。
- True
复制代码
2.isinstance(object,classinfo)
#用来判断一个对象是否是已知类型(判断一个实例对象是否属于一个类),类似于type()。与type()不同的是isinstance()会认为子类和父类是一种类型,会考虑继承关系。
#classinfo对象同样可以是元组,只要object对象是其中任何一个候选的类对象实例,则返回True。
#注意:1.如果第一个参数不是object对象,则永远返回False。2.如果第二个参数不是类也不是由类对象组成的元组,则会抛出TypeError异常。
参数:
object--实例对象
classinfo--类对象,也可以是一个里边有多个类的元组
返回值:返回True或False。
例:
- >>> class A:
- pass
- >>> class B(A):
- pass
- >>> class C:
- pass
- >>> b1 = B()
- >>> isinstance(b1,B)
- True
- >>> isinstance(b1,A) #因为会考虑继承关系,所以返回True。
- True
- >>> isinstance(b1,(A,B))
- True
- >>> isinstance(b1,(A,B,C))
- True
- >>>
复制代码
3.hasattr(object,name)
#用来判断对象是否包含对应的属性。attr = attribute(属性的意思)
参数:
object--实例对象。
name--字符串型的属性名。
返回值:True或者False。
例:
- >>> class C:
- def __init__(self,x):
- self.x = x
- >>> c = C(3)
- >>> hasattr(c,"x") #属性名必须用引号括起来,否则Python会误认为是变量。
- True
复制代码
4.getattr(object,name[,default])
#用于返回一个对象指定属性的值。如果属性没有值,返回default的值。如果default参数未设置值的话,会引发Attribute异常。
参数:
object--对象。
name--字符串型的属性名。
default--如果对象的属性没有值的话,返回default。
返回值:返回对象指定属性对应的值。
例:
- >>> class C:
- def __init__(self,x):
- self.x = x
- >>> c = C(3)
- >>> getattr(c,"x") #属性名同样要用双引号括起来。
- 3
- >>> getattr(c,"y","你访问的属性不存在...")
- '你访问的属性不存在...' #在访问不存在的属性后返回default参数的值。
复制代码
5.setarrt(object,name,value)
#用于设置指定属性的值。前提是该属性必须存在。
参数:
object -- 实例对象。
name -- 字符串型的属性名字。
value -- 要设置属性的值。
返回值:无
例:
- >>> class C:
- def __init__(self,x):
- self.x = x
- >>> c = C(3)
- >>> setattr(c,"y",20) #当然也可以这样写 c.y = 20
- >>> getattr(c,"y","你访问的属性不存在...")
- 20
复制代码
6.delattr(object,name)
#用于删除对象指定的属性。
参数:
object -- 实例对象
name -- 要删除的属性名(字符串型)
返回值:无
例:
- >>> class C:
- def __init__(self,x):
- self.x = x
- >>> c = C(3)
- >>> setattr(c,"y",20) #当然也可以这样写 c.y = 20
- >>> delattr(c,"y")
- >>> delattr(c,"y") #如果删除的属性不存在那么抛出异常。
- Traceback (most recent call last):
- File "<pyshell#33>", line 1, in <module>
- delattr(c,"y")
- AttributeError: y
复制代码
7.property(fget = None,fset = None,fdel = None,doc = None)
#通过属性来设置属性。用新的形式来访问类的方法。
参数:
fget -- 获取属性值的函数
fset -- 设置属性值的函数
fdel -- 删除属性值的函数
doc -- 属性描述信息
返回值:返回新的访问方法的形式。
例:
- >>> class D:
- def __init__(self,x):
- self.x = x
- def get_x(self):
- return self.x
- def set_x(self,y):
- self.x = y
- def del_x(self):
- delattr(self,"x")
- z = property(get_x,set_x,del_x) #调用property方法,将上面的方法换成用z去访问。
- >>> d1 = D(10)x
- >>> d1.z #通过这种方式来调用get_x方法。
- 10
- >>> d1.z = 11 #通过这种方式来调用set_x方法。
- >>> del d1.z #通过这种方式来调用del_x方法。
- >>> d1.z
- Traceback (most recent call last):
- File "<pyshell#99>", line 1, in <module>
- d1.z
- File "<pyshell#93>", line 5, in get_x
- return self.x
- AttributeError: 'D' object has no attribute 'x'
复制代码
8.函数修饰符(装饰器)
什么是装饰器:
装饰器本质上就是一个函数。
高阶函数 + 嵌套函数 = 装饰器 #高阶函数:参数和返回值都是函数。
装饰器的原则:
1.不能修改被装饰的函数的源代码。
2.不能够改变被装饰函数的调用方式。
例:
- import time
- def my_time(func): #这个就是装饰器,他的作用就是计算一个函数运行了多长时间。
- def wrapper():
- s_time = time.clock()
- temp = func() #这里运用了闭包(在内部函数里,对外部函数的参数进行引用。)
- e_time = time.clock()
- print("方法%s耗时%s秒" % (func.__name__,e_time - s_time))
- return temp #返回函数func()也就是函数f()的返回值。
- return wrapper
- #在函数前面用@加上装饰器的名称来使用装饰器。
- @my_time #其实等价于 f = my_time(f)这一句,然后在调用函数f。
- def f():
- print("my function")
- time.sleep(2)
- f()
复制代码
多重装饰器问题:
- import time
- def long(func): #第6步,此时func是wrapper1.
- def wrapper(*args,**kwargs):
- print("函数%s的日志:" % func.__name__)
- temp = func() #第7步,在这里才执行func()也就是wrapper1()中的内容。
- return temp #第10步,由于没有返回值,所以temp为空
- return wrapper #第11步,返回wrapper函数,。
- def my_time(func): #第3步,此时func是函数f()
- def wrapper1():
- s_time = time.clock()
- func() #第8步,这时候在开始执行func(),也就是函数f()
- e_time = time.clock()
- print("方法%s耗时%s秒" % (func.__name__,e_time - s_time))
- return wrapper1 #第4步,并不会执行wrapper1中的内容,而是整个返回到装饰器long中。
- @long #第5步,执行装饰器long
- @my_time #第2步,执行装饰器my_time
- def f():
- print("my function") #第9步,执行函数f()中的内容。
- time.sleep(2)
- f() #第1步,调用函数f。
- #执行结果
- 函数wrapper1的日志:
- my function
- 方法f耗时2.0246411847711845秒
复制代码
总结一下:从里向外依次装饰。
带参数的装饰器:
- import time
- def my_time(func): #这个就是装饰器,他的作用就是计算一个函数运行了多长时间。
- def wrapper(*args,**kwargs):#由于不知道用装饰器的函数有没有参数,所以在这加入可变参数。
- s_time = time.clock()
- temp = func(*args,**kwargs) #同样这里也要加上可变参数。
- e_time = time.clock()
- print("方法%s耗时%s秒" % (func.__name__,e_time - s_time))
- return temp #返回函数func()也就是函数f()的返回值。
- return wrapper
- @my_time #其实等价于 f = my_time(f)这一句,然后在调用函数f("sbd")。
- def f(x): #如果函数中有参数,那么需要改变装饰器的内容。
- print("my function")
- time.sleep(2)
- print(x)
- return "ss"
- f("sbd")'''
复制代码
终极版装饰器(可以控制装饰器中返回的值)
- def log(text):
- def decorator(func):
- def wrapper(*args,**kwargs): #添加可变参数,来应对各种有参或无参的函数。
- print(text) #利用闭包控制装饰器中的内容。
- temp = func(*args,**kwargs) #设置中间变量接受返回值
- return temp
- return wrapper
- return decorator
- @log("时间细碎而又匆忙的从我指间流过") #其实就是通过装饰器@log调用装饰器@decorator
- def f(x,y):
- print("我是函数f()")
- return "sdfsdf"
- print(f(1,3))
- """
- @log 这句话相当于:
- a1 = log("我是日志") #当然也可以这样 f = log("sssss")(f)(1,3)
- a2 = a1(f)
- print(a2(1,3)) #注意最后的这个函数就是原函数f(),所以要加上参数。
- """
- #结果
- 时间细碎而又匆忙的从我指间流过
- 我是函数f()
- sdfsdf
复制代码
Python中内置的修饰符
staticmethod -- 把类中定义的实例方法变成静态方法。
classmethod -- 把类中定义的实例方法变成类方法。
property -- 把类中定义的实例方法变成类属性。 |
评分
-
查看全部评分
|