鱼C论坛

 找回密码
 立即注册
查看: 1675|回复: 0

[技术交流] 38 类和对象:一些相关的BIF - 景命

[复制链接]
发表于 2017-8-25 22:48:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
知识点:

1.issubclass(class,classinfo)
        #用于检查参数class是否是类型参数classinof的子类。注意:1.这种检查属于非严格型的检查,一个类会被认为是自身的子类。2.classinfo可以是类对象组成的元组,只要class是其中任何一个候选的类对象子类,则返回True。
        参数:
                class--类对象。
                classinfo--类或者类对象组成的元组。
        返回值:True或者False。

例:
  1. >>> class A:
  2.         pass

  3. >>> class B(A):
  4.         pass

  5. >>> class C:
  6.         pass

  7. >>> issubclass(B,A)
  8. True
  9. >>> issubclass(B,B)
  10. True
  11. >>> issubclass(C,A)
  12. False
  13. >>> issubclass(B,(A,C))        #只要A和C中有一个是B的父类,则返回True。
  14. True
复制代码



2.isinstance(object,classinfo)
        #用来判断一个对象是否是已知类型(判断一个实例对象是否属于一个类),类似于type()。与type()不同的是isinstance()会认为子类和父类是一种类型,会考虑继承关系。
        #classinfo对象同样可以是元组,只要object对象是其中任何一个候选的类对象实例,则返回True。
        #注意:1.如果第一个参数不是object对象,则永远返回False。2.如果第二个参数不是类也不是由类对象组成的元组,则会抛出TypeError异常。
        参数:
                object--实例对象
                classinfo--类对象,也可以是一个里边有多个类的元组
        返回值:返回True或False。
例:
  1. >>> class A:
  2.         pass

  3. >>> class B(A):
  4.         pass

  5. >>> class C:
  6.         pass
  7. >>> b1 = B()
  8. >>> isinstance(b1,B)
  9. True
  10. >>> isinstance(b1,A)        #因为会考虑继承关系,所以返回True。
  11. True
  12. >>> isinstance(b1,(A,B))
  13. True
  14. >>> isinstance(b1,(A,B,C))
  15. True
  16. >>>
复制代码



3.hasattr(object,name)
        #用来判断对象是否包含对应的属性。attr = attribute(属性的意思)
        参数:
                object--实例对象。
                name--字符串型的属性名。
        返回值:True或者False。
例:
  1. >>> class C:
  2.         def __init__(self,x):
  3.                 self.x = x
  4. >>> c = C(3)
  5. >>> hasattr(c,"x")                #属性名必须用引号括起来,否则Python会误认为是变量。
  6. True
复制代码



4.getattr(object,name[,default])
        #用于返回一个对象指定属性的值。如果属性没有值,返回default的值。如果default参数未设置值的话,会引发Attribute异常。
        参数:
                object--对象。
                name--字符串型的属性名。
                default--如果对象的属性没有值的话,返回default。
        返回值:返回对象指定属性对应的值。
例:
  1. >>> class C:
  2.         def __init__(self,x):
  3.                 self.x = x
  4. >>> c = C(3)
  5. >>> getattr(c,"x")                #属性名同样要用双引号括起来。
  6. 3
  7. >>> getattr(c,"y","你访问的属性不存在...")
  8. '你访问的属性不存在...'        #在访问不存在的属性后返回default参数的值。
复制代码



5.setarrt(object,name,value)
#用于设置指定属性的值。前提是该属性必须存在。
        参数:
                object -- 实例对象。
                name -- 字符串型的属性名字。
                value -- 要设置属性的值。
        返回值:无
例:
  1. >>> class C:
  2.         def __init__(self,x):
  3.                 self.x = x
  4. >>> c = C(3)
  5. >>> setattr(c,"y",20)                        #当然也可以这样写 c.y = 20
  6. >>> getattr(c,"y","你访问的属性不存在...")
  7. 20
复制代码



6.delattr(object,name)
#用于删除对象指定的属性。
        参数:
                object -- 实例对象
                name -- 要删除的属性名(字符串型)
        返回值:无
例:
  1. >>> class C:
  2.         def __init__(self,x):
  3.                 self.x = x
  4. >>> c = C(3)
  5. >>> setattr(c,"y",20)                        #当然也可以这样写 c.y = 20
  6. >>> delattr(c,"y")
  7. >>> delattr(c,"y")                        #如果删除的属性不存在那么抛出异常。
  8. Traceback (most recent call last):
  9.   File "<pyshell#33>", line 1, in <module>
  10.     delattr(c,"y")
  11. AttributeError: y
复制代码



7.property(fget = None,fset = None,fdel = None,doc = None)
        #通过属性来设置属性。用新的形式来访问类的方法。
        参数:
                fget -- 获取属性值的函数
                fset -- 设置属性值的函数
                fdel -- 删除属性值的函数
                doc -- 属性描述信息
        返回值:返回新的访问方法的形式。
例:
  1. >>> class D:
  2.         def __init__(self,x):
  3.                 self.x = x
  4.         def get_x(self):
  5.                 return self.x
  6.         def set_x(self,y):
  7.                 self.x = y
  8.         def del_x(self):
  9.                 delattr(self,"x")
  10.         z = property(get_x,set_x,del_x)        #调用property方法,将上面的方法换成用z去访问。

  11. >>> d1 = D(10)x
  12. >>> d1.z                                        #通过这种方式来调用get_x方法。
  13. 10
  14. >>> d1.z = 11                                #通过这种方式来调用set_x方法。
  15. >>> del d1.z                                #通过这种方式来调用del_x方法。
  16. >>> d1.z
  17. Traceback (most recent call last):
  18.   File "<pyshell#99>", line 1, in <module>
  19.     d1.z
  20.   File "<pyshell#93>", line 5, in get_x
  21.     return self.x
  22. AttributeError: 'D' object has no attribute 'x'
复制代码



8.函数修饰符(装饰器)

        什么是装饰器:
                装饰器本质上就是一个函数。
                高阶函数 + 嵌套函数 = 装饰器                #高阶函数:参数和返回值都是函数。


        装饰器的原则:
                1.不能修改被装饰的函数的源代码。
                2.不能够改变被装饰函数的调用方式。

例:
  1. import time
  2. def my_time(func):                #这个就是装饰器,他的作用就是计算一个函数运行了多长时间。
  3.     def wrapper():
  4.         s_time = time.clock()
  5.         temp = func()                #这里运用了闭包(在内部函数里,对外部函数的参数进行引用。)
  6.         e_time = time.clock()
  7.         print("方法%s耗时%s秒" % (func.__name__,e_time - s_time))
  8. return temp                #返回函数func()也就是函数f()的返回值。
  9.     return wrapper

  10. #在函数前面用@加上装饰器的名称来使用装饰器。
  11. @my_time                #其实等价于 f = my_time(f)这一句,然后在调用函数f。
  12. def f():
  13.     print("my function")
  14.     time.sleep(2)

  15. f()
复制代码



多重装饰器问题:
  1. import time

  2. def long(func):             #第6步,此时func是wrapper1.
  3.     def wrapper(*args,**kwargs):
  4.         print("函数%s的日志:" % func.__name__)
  5.         temp = func()   #第7步,在这里才执行func()也就是wrapper1()中的内容。
  6.         return temp             #第10步,由于没有返回值,所以temp为空
  7.     return wrapper     #第11步,返回wrapper函数,。

  8. def my_time(func):          #第3步,此时func是函数f()
  9.     def wrapper1():
  10.         s_time = time.clock()
  11.         func()                      #第8步,这时候在开始执行func(),也就是函数f()
  12.         e_time = time.clock()
  13.         print("方法%s耗时%s秒" % (func.__name__,e_time - s_time))
  14.     return wrapper1   #第4步,并不会执行wrapper1中的内容,而是整个返回到装饰器long中。

  15. @long                       #第5步,执行装饰器long
  16. @my_time                    #第2步,执行装饰器my_time
  17. def f():
  18.     print("my function") #第9步,执行函数f()中的内容。
  19.     time.sleep(2)
  20. f()                             #第1步,调用函数f。

  21. #执行结果
  22. 函数wrapper1的日志:
  23. my function
  24. 方法f耗时2.0246411847711845秒
复制代码

总结一下:从里向外依次装饰。

带参数的装饰器:
  1. import time
  2. def my_time(func):                #这个就是装饰器,他的作用就是计算一个函数运行了多长时间。
  3.     def wrapper(*args,**kwargs):#由于不知道用装饰器的函数有没有参数,所以在这加入可变参数。
  4.         s_time = time.clock()
  5.         temp = func(*args,**kwargs) #同样这里也要加上可变参数。
  6.         e_time = time.clock()
  7.         print("方法%s耗时%s秒" % (func.__name__,e_time - s_time))
  8.         return temp                #返回函数func()也就是函数f()的返回值。
  9.     return wrapper

  10. @my_time                #其实等价于 f = my_time(f)这一句,然后在调用函数f("sbd")。
  11. def f(x):       #如果函数中有参数,那么需要改变装饰器的内容。
  12.     print("my function")
  13.     time.sleep(2)
  14.     print(x)
  15.     return "ss"

  16. f("sbd")'''
复制代码



终极版装饰器(可以控制装饰器中返回的值)
  1. def log(text):
  2.     def decorator(func):
  3.         def wrapper(*args,**kwargs):                  #添加可变参数,来应对各种有参或无参的函数。
  4.             print(text)                                     #利用闭包控制装饰器中的内容。
  5.             temp = func(*args,**kwargs)         #设置中间变量接受返回值
  6.             return temp
  7.         return wrapper
  8.     return decorator

  9. @log("时间细碎而又匆忙的从我指间流过") #其实就是通过装饰器@log调用装饰器@decorator
  10. def f(x,y):
  11.     print("我是函数f()")
  12.     return "sdfsdf"
  13. print(f(1,3))

  14. """
  15. @log 这句话相当于:
  16. a1 = log("我是日志")                #当然也可以这样 f = log("sssss")(f)(1,3)
  17. a2 = a1(f)
  18. print(a2(1,3))                                #注意最后的这个函数就是原函数f(),所以要加上参数。
  19. """

  20. #结果
  21. 时间细碎而又匆忙的从我指间流过
  22. 我是函数f()
  23. sdfsdf
复制代码


Python中内置的修饰符
        staticmethod -- 把类中定义的实例方法变成静态方法。
        classmethod -- 把类中定义的实例方法变成类方法。
        property -- 把类中定义的实例方法变成类属性。

评分

参与人数 1鱼币 +6 收起 理由
小甲鱼 + 6

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 13:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表