鱼C论坛

 找回密码
 立即注册
查看: 1746|回复: 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。

例:
>>> 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 -- 把类中定义的实例方法变成类属性。

评分

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

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 19:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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