马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 -- 把类中定义的实例方法变成类属性。 |