在查看网页源码的时候经常会发现带有类似 ?v=13566 或者 ?version=15678 的 CSS 和 JS 文件。如下所示: 会缓存这些CSS或JS文件,每次更新了 JS 或 CSS 文件后,改变版本号,客户端浏览器就会重新下载新的JS或CSS文件,起到刷新缓存的作用。...一个网站的访客成千上万,你不可能在更新 CSS 后让每个访客都刷新一下缓存,那么这个问题你会怎么处理呢? 方法一:更改CSS文件名 其实解决这个问题很简单,缓存是通过文件名标记缓存的内容的。...的资源,所以方法二可能会导致你原先的缓存功能失效,可以改用第一种方法。...总结: 其实CSS文件后面的问号起不到实际作用,仅能当作后缀,如果用问号加参数的方法,可以添加版本号等信息,同时可以刷新一下浏览器端的缓存。一个小小的细节,可以给我们带来很大的方便。
一、C++ 异常处理 - 抛出自定义类对象异常 1、抛出 异常对象 如果 抛出的 指针类型 , 指向的是 实际的对象 , 那么就要涉及到 对象的 内存空间的 分配 与 释放 ; 涉及到 内存空间 的 申请...和 释放 , 就需要考 讨论 异常 的生命周期 , 什么时候申请内存 , 什么时候释放内存 ; 2、代码示例 - 抛出 异常对象 下面的代码中 , 声明了 3 个自定义类 Exception1 , Exception2..., Exception3 ; 在不同的时机 , 抛出不同的 自定义类 对象 ; 抛出异常 , 直接使用 throw 关键字抛出 , Exception1 对象在抛出时创建 ; throw Exception1...// 拷贝前检查条件 // 源字符串不能是 J 开头的 if (*from == 'J') { // 这些写会导致野指针出现 // 该行代码执行完成后, 出了作用域该对象会被析构...// 拷贝前检查条件 // 源字符串不能是 J 开头的 if (*from == 'J') { // 这些写会导致野指针出现 // 该行代码执行完成后, 出了作用域该对象会被析构
也就是说,当读取器找到相关元素时,它会创建相关类的新对象。新对象由从XML文档读取的数据填充。可以通过在启用XML的类中(或在自己的自定义XML适配器中)重新定义XMLNew()来自定义此行为。...包含这一点只是为了方便自定义的XMLNew()方法,我们也将该方法添加到该类中。...DHC-APP>w ##class(PHA.TEST.Xml).ReadFile() 正在更新现有对象...Quine,Maria K.示例2:在自定义XML适配器中修改XMLNew()在第二个示例中,...我们创建一个自定义XML适配器来执行与第一个示例相同的操作。...其目的是,如果在子类中重新定义IdForExport,则相应地重新定义NAMEOFEXPORTID。在这个类中,XMLNew()方法是一个方法生成器。
Python 中的 type 函数有两个用法,二者意义相去甚远:type(name, bases, dict):创建一个新的类对象type(object):返回对象的类型自定义元类当我们需要在类创建时进行一些特殊的控制或修改时...__getattribute__ ,参考: A key difference between __getattr__ and __getattribute__ is that __getattr__...翻译: __getattr__ 和 __getattribute__ 之间的一个关键区别是,只有当属性无法通过常规方式找到时,才会调用 __getattr__ 。...如果没有实现,我们就抛出一个 TypeError 异常。...TypeErrorexcept TypeError as e: print(e)使用元类的注意事项不要过度使用:元类是强大的工具,但也容易导致代码难以理解和维护。
此外,注意到任意调用如s.abc都会返回None,这是因为我们定义的__getattr__默认返回就是None。...要让class只响应特定的几个属性,我们就要按照约定,抛出AttributeError的错误: class Student(object): def __getattr__(self, attr...__call__()还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。...如果你把对象看成函数,那么函数本身其实也可以在运行期动态创建出来,因为类的实例都是运行期创建出来的,这么一来,我们就模糊了对象和函数的界限。 那么,怎么判断一个变量是对象还是函数呢?...其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个Callable对象,比如函数和我们上面定义的带有__call()__的类实例: >>> callable(Student())
len() 方法被调用时,Python 会自动调用对象的 __len__ 方法。...获取不存在的属性名 — __getattr__ __getattr__(self, name) 通过类实例点属性名可以实现类属性的访问,但有时我们需要定义当属性名不存在时的行为,这时就需要实现魔术方法:...__getattr__ 这个方法只有在用户访问的类属性不存在时才会被调用,通常,你可以在实现的 __getattr__ 中做兜底操作或抛出异常,也可以结合 __setattr__ 方法实现对某个属性的彻底控制...,只要在类外为不存在的属性赋值,改属性就会被创建,而 __getattr__ 只有在属性不存在的情况下才会被调用,此时,如果你需要定义独特的某个属性的行为,或彻底隐藏某个属性,就必须实现 __setattr...但是,运行上述代码却抛出了异常: AttributeError: ’TechlogTest’ object has no attribute ’values’ 这是为什么呢?
面向对象的内置魔法函数 __str__ ''' __str__ 会在对象被转为字符串时,转换的结果就是这个函数的返回值 使用场景:我们可以利用该函数来自定义,对象是打印格式 ''' class...__slots__定义之外的属性 __getattr__ __setattr__ __delattr__ 及点语法原理 __getattr__ 用 .访问属性时,如果属性不存在,执行 __setattr...,同时调用对应的处理函数,当我们需要自定义对象的比较规则时,就可以在子类中覆盖大于等于等的方法 案例 # 自定义对象的比较 # 对象直接无法直接比较大小 class Person: def....Student object at 0x000001992C7C8F98> # __gt__ # True print(stu1 会自动交换两个对象的位置...,我们可以自定义运算符来实现,让自定义对象也支持比较符 上述代码中.other指的是另一个参与比较的对象 大于和小于只要实现一个即可,符号如果不同解释器会自动交换两个对象的位置 迭代器协议 迭代器:是指具有
): ...: return 1 ...: In [2]: hash(Point()) Out[2]: 1 __hash__方法必须返回int,否则会抛出TypeError...即使with块抛出异常,__enter__和__exit__也会被执行,所以上下文管理是安全的。...__exit__方法 __exit__的返回值,没有办法获取到,如果with块中抛出异常 __exit__返回False的时候,会向上抛出异常,返回True, 会屏蔽异常 class Context:...__ __setattr__ __delattr__ 当一个类定义了__getattr__方法时,如果访问不存在的成员,会调用__getattr__方法 class A: def __init_...即访问不存在的成员,会调用__getattr__方法 当一个类实现了__setattr__时, 任何地方对这个类的对象增加属性,或者对现有属性赋值,都会调用__setattr__ class A:
for循环了,或者已经list过1次之后,在list或者是for循环就会报错,或者是得到空列表,是因为next()已经调用了,现在已经是抛出StopIteration()停止迭代的异常,所以就不能再for...此外,注意到任意调用如s.abc都会返回None,这是因为我们定义的__getattr__默认返回就是None。...要让class只响应特定的几个属性,我们就要按照约定,抛出AttributeError的错误: class Student(object): def __getattr__(self, attr):...__call__()还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。...其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个Callable对象,比如函数和我们上面定义的带有__call()__的类实例: >>> callable(Student())
在快速发展的数字化时代,笔记已经从传统的纸质记录演变为各种线上工具的竞争领域。作为现代用户,我们对笔记工具的需求不只是记录,还包括效率、隐私和灵活性。...Daino Notes,以其优雅的设计和独特的功能,正在彻底改变我们的笔记方式。 Daino Notes 是什么?...Daino Notes 的核心理念是,书写是一种奇妙的创造体验。通过它简洁优雅的设计和实用功能,它致力于帮助用户更好地表达自己。...快速搜索 强大的搜索功能让笔记查询变得不费吹灰之力 个性化主题 Daino 支持自定义主题,个性化主题则让你的记录体验更加愉悦。...打开 Daino Notes,无需等待加载,立刻开始记录;拖动段落,重新组织你的剧情;用 Markdown 格式化你的章节标题。最后,一键保存到本地,让你的故事完全掌握在你自己手中。
: '_wrap_close' object is not an iterator >>> 如果你对 Python 的魔法方法有所了解,就能发现这里的奇怪之处:popen的对象有__next__()方法..._stream) popen()返回了一个_wrap_close对象,而后者仅仅是一个 Iterable,而不是 Iterator(没有定义__next__())。...然而,_wrap_close却定义了__getattr__()魔法方法,这样所有其他找不到的属性、方法就会传递给self._stream对象,而这个对象有__next__()方法。这就解释了为什么r....所以,Python 对于魔法方法的调用是基于这个类有没有定义此方法吗?...__getattr__(name) class Foo(metaclass=IterMeta): pass foo = Foo() next(foo) # TypeError: 'Foo'
调用的时候,如果key的类型错误,该方法应该抛出TypeError; 如果没法返回key对应的数值时,该方法应该抛出ValueError。...如果__exit__返回None, 那么如果有异常,异常将正常抛出,这时候with的作用将不会显现出来。 举例说明: 这该示例中,IndexError始终会被隐藏,而TypeError始终会抛出。...dict对象执行dict_[thing]会怎么样呢?...如果过程中转化失败,抛出TypeError。 比如对于coerce(10, 10.1), 因为10和10.1在进行算术运算时,会先将10转为10.0再来运算。...你可能会问, 为什么不是命名为__bool__? 我也不知道。 我只知道该方法在Python3中改名为__bool__了。 __dir__(self) 对实例使用dir()时调用。
如果贵州这样的人才资源都可以,你为什么不可以? 五新影响将改变世界 我今天主要讲一个观点,我们人类在进入重新定义很多事情的世界。...贵州现在做的事情,我觉得每个城市都可以做,贵州人现在在做的事情,每个人都有机会在做。大数据时代,人人有机会。但是我们对做的事情的定义要进行重新定义。什么是重新定义?...20世纪如果是工业制造的能力,那么21世纪是服务的能力。 所以,新零售是我们必须对零售重新定义,原来卖货,未来卖服务。新制造更是重新定义。...今天中国有技术,有资金,我们今天也有市场,为什么我们不可以用自己的思考重新定义一下未来,超越任何一个国家、超越任何一家公司都没有多大意义,超越未来、追赶未来,为别人、为世界、为未来创造独特的价值才是真正的意义...但是可怕的是,未来三十年是去就业的速度和增长新就业速度来比的话,失去速度会更快,增加的速度要到三十年以后才会形成,而且这个三十年以后也必须得今天的教育体系、教育课程、教育设置进行重新定义和思考。
分享一个在go tour上看到的练习题,练习里要求用户自己定义一个错误类型,实现 error接口,函数在参数不满足条件的时候返回自定义的错误类型的值。...注意: 在 Error 方法内调用 fmt.Sprint(e) 会让程序陷入死循环。可以通过先转换 e 来避免这个问题:fmt.Sprint(float64(e))。这是为什么呢?...import ( "fmt") type ErrNegativeSqrt float64 func (e ErrNegativeSqrt) Error() string { // 这里直接使用e值会内存溢出..., err } return 0, nil} func main() { fmt.Println(Sqrt(2)) fmt.Println(Sqrt(-2))} 接下来探究一下为什么在练习中把值...,感兴趣的可以通过阅读原文的链接访问到go tour上的这个练习题自己试验一下。
Python类有大量特殊方法,实现不同的特殊方法后该类对象则会支持对应的运算符或内置函数,下面的对应关系表列出了大部分特殊方法: 方法功能说明__new__()类的静态方法,用于确定是否要创建对象__init...__()打印、转换,要求该方法必须返回str类型的数据__getitem__()按照索引获取值__setitem__()按照索引赋值__delattr__()删除对象的指定属性__getattr__()...__getattribute__()获取对象指定属性的值,如果同时定义了该方法与__getattr__(),那么__getattr__()将不会被调用,除非在__getattribute__()中显式调用...__getattr__()或者抛出AttributeError异常__setattr__()设置对象指定属性的值__base__该类的基类__class__返回对象所属的类__dict__对象所包含的属性与值的字典...__subclasses__()返回该类的所有子类__call__()包含该特殊方法的类的实例可以像函数一样调用__get__()定义了这三个特殊方法中任何一个的类称作描述符(descriptor),描述符对象一般作为其他类的属性来使用
此外,注意到任意调用如s.abc都会返回None,这是因为我们定义的__getattr__默认返回就是None。...要让class只响应特定的几个属性,我们就要按照约定,抛出AttributeError的错误: class Student(object): def __getattr__(self, attr...__call__()还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。...如果你把对象看成函数,那么函数本身其实也可以在运行期动态创建出来,因为类的实例都是运行期创建出来的,这么一来,我们就模糊了对象和函数的界限。 那么,怎么判断一个变量是对象还是函数呢?...其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个Callable对象,比如函数和我们上面定义的带有__call__()的类实例: >>> callable(Student())
当我们使用()运算符调用一个对象时,Python会自动调用该对象的__call__方法,并将()中的参数传递给__call__方法。因此,我们可以在__call__方法中实现自定义的对象调用行为。...同时,__call__方法也可以带有参数,从而支持多种不同的调用方式。__getattr__方法__getattr__方法是用于实现对象属性访问的魔术方法。...当我们使用点运算符访问一个对象的属性时,如果该属性不存在,Python会自动调用该对象的__getattr__方法,并将属性名称作为参数传递给__getattr__方法。...如果属性名称不为'x'或者'y',则会抛出AttributeError异常。因此,我们可以使用__getattr__方法为对象动态添加属性,从而实现灵活的对象属性访问行为。...需要注意的是,__getattr__方法只有在对象的属性不存在时才会被触发,因此我们可以在__getattr__方法中实现对特定属性的自定义处理逻辑。
,定义后使用 实现比较复杂功能,常常是一些我们常见类的特性的实现原理,具体分为 实例成为可迭代对象(列表的特性) 实例索引取值(列表的特性) 上下文管理(文件的特性)等 简单功能 这部分包括上面列出的前两个点...,只有定义了这个,实例才可以像函数一样后面加括号 __str__ print实例时打印出来的内容,不定义可以调用,重新定义后则可以定制打印内容 __repr__ 直接输出实例名打印出来的内容,不定义可以调用...,重新定义后则可以定制打印内容 __new__ 创建实例时自动调用 __del__ 对象在内存中被释放时触发(后面不设置例子) __len__ 定义 len(实例) 返回的内容,比如字符串类就定义的是字符串的字符个数...除此之外还有转化为整数、浮点, __getattr__ 当实例访问的属性未被定义时,原来会报错,定义了这个之后就会按照这里定义的来输出. setattr 则可以设置属性 delattr则删除属性 下面是上面方法的使用展示...__class__ # 查看所属类 # __main__.Special dir(s) # 返回实例的所有属性和方法,调用了__dir__()方法 可迭代对象 使实例成为可迭代对象(可以被for循环的
key 我们通过上面的方法,可以自定义一些信息,如果我们写_getattr_方法,当程序中找不到我们要调用的属性时程序会直接报错 3.数据描述符 3.1数据描述符 在类中实现了get、set、delete...,如果指定了 metaclass 程序会先按照我们指定的方法或类进行创建 6.迭代器和生成器 6.1迭代器 在介绍迭代器之前,先说明下迭代的概念: 迭代:通过for循环遍历对象的每一个元素的过程...Python的for语法功能非常强大,可以遍历任何可迭代的对象。 在Python中,list/tuple/string/dict/set/bytes都是可以迭代的数据类型。...迭代器是一种可以被遍历的对象,并且能作用于next()函数。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。...斐波纳契 数列 6.2.1 return 和 yield 的区别 return会直接返回一次的值,但是 yield 会在yield时候程序会进行暂停,并且保存数据,并且会继续循环,直至循环完成 7