匹配(推断) 上下文 -----> 上下文类型 -----------> 变量类型 前者从值到类型,后者从类型到类型。 继承关系中的成员函数重写,算是逆变的典型例子: class Example { foo(maybe: number | undefined) { } str(str: string) { } compare 更进一步地,在比较两个函数类型时,只要一方参数兼容另一方的参数即可,如上例中dogComparer与animalComparer能够相互赋值 可选参数和剩余参数 比较参数兼容性时,不要求匹配可选参数,比如原类型具有额外的可选参数是合法的 ,目标类型缺少相应的可选参数也是合法的 对于剩余参数,就当成是无限多个可选参数,也不要求严格匹配。 对于存在多个重载的函数,要求源函数的每个重载版本在目标函数上都有对应的版本,以保证目标函数可以在所有源函数可调用的地方调用,例如: interface sum { (a: number, b: number
多态 要理解多态的好处,我们还需要再编写一个函数,这个函数接受一个Animal类型的变量: def run_twice(animal): animal.run() animal.run( 由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思: 对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型 在调用类实例方法的时候,尽量把变量视作父类类型,这样,所有子类类型都可以正常被接收; 旧的方式定义Python类允许不从object类继承,但这种编程方式已经严重不推荐使用。 下面的类,没有定义str()方法,打印结果是: class Foo: pass obj = Foo() print(obj) 定义了__str__()方法后,打印结果是:'jack'。 有些Python内置数据类型,比如int就带有这些方法。Python支持运算符的重载,也就是重写。
腾讯云即时通信,1分钟跑通DEMO,结合开源 UI 库,快速搭建IM 应用,全球多点覆盖
多态 要理解多态的好处,我们还需要再编写一个函数,这个函数接受一个Animal类型的变量: def run_twice(animal): animal.run() animal.run 由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思: 对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型 在调用类实例方法的时候,尽量把变量视作父类类型,这样,所有子类类型都可以正常被接收; 旧的方式定义Python类允许不从object类继承,但这种编程方式已经严重不推荐使用。 下面的类,没有定义str()方法,打印结果是: class Foo: pass obj = Foo() print(obj) 定义了__str__()方法后,打印结果是:'jack'。 有些Python内置数据类型,比如int就带有这些方法。Python支持运算符的重载,也就是重写。
document.querySelectorAll('img')); 5.Array.prototype.of() Array.of() 方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型 y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。 // true 上面代码的\S是预定义模式,匹配所有不是空格的字符。只有加了u修饰符,它才能正确匹配码点大于0xFFFF的Unicode字符。 利用这一点,可以写出一个正确返回字符串长度的函数。 字符串中有变量或者表达式 如果字符串不是静态内容,往往是需要加载变量或者表达式,这个也是很常见的需求。 中Function.prototype.apply()方法类似:调用一个方法并且显式地指定this变量和参数列表(arguments) ,参数列表可以是数组,或类似数组的对象。
解构赋值语法是 JavaScript 的一种表达式,可以方便的从数组或者对象中快速提取值赋给定义的变量。 获取数组中的值 从数组中获取值并赋值到变量中,变量的顺序与数组中对象顺序对应。 没有展开语法的时候,只能组合使用 push,splice,concat 等方法,来将已有数组元素变成新数组的一部分。 4.正则表达式命名捕获组 JavaScript 正则表达式可以返回一个匹配的对象——一个包含匹配字符串的类数组,例如:以 YYYY-MM-DD的格式解析日期: const reDate = /([0- ,并且改变正则表达式的结构有可能改变匹配对象的索引。 这意味着匹配会发生,但不会有任何捕获,并且断言没有包含在整个匹配字段中。例如从价格中捕获货币符号: const reLookahead = /\D(?
(issubclass(Zi,Foo)) #True 10 print(issubclass(Zi,Sun)) # False issubclass 2、type(对象) 返回该对象的数据类型 从定义看,函数就相当于一个数学公式,它不与其他东西相互关联,传递相应的参数就能用。而方法是,定义在类内部的函数,并且这个函数和类或类的实例对象有某种关联,访问时会自动传递一个参数作为第一参数。 简单来说: 函数没和类或对象进行绑定; 方法和类或对象有绑定 # 区分函数和方法: ? ? #<function Car.fly at 0x0000000001EA9D08> 这里是函数,没有和类绑定,所以需要下面手动传值 20 f(c) # f是函数,没有和类绑定,所以需要手动传值 bmw",20000) 26 27 def fly(): 28 print("通过对象c修改fly方法") 29 30 setattr(c,"fly",fly) #并没有改变类中的内容
目前已经有数种编程语言或脚本语言支援(或者说解析)这种语言。 ——维基百科 YAML 仍然是一门标记性语言,但为了强调这门语言以数据为中心,而不是以标记语言为中心。采用反向缩略语重新命名。 基本语法规则: 1.大小写敏感 2.使用缩进表示层级关系 3.不允许使用TAB键来缩进,只允许使用空格键来缩进 4.缩进的空格数量不重要 5.使用"#"来表示注释 支持的数据格式: .纯量(scalars):单个的,不可再分的值 以下分别介绍这三种数据格式 对象 对象的一组键值对,是用冒号结构来表示 animal: pets 转为JavaScript { animal: 'pets 以下数据类型都是javaScript的纯量。 str 123 f: !!str true 转为JavaScript { e: '123', f: 'true'} 字符串 字符串是最常见,也是最复杂的一种数据类型。 字符串默认不适用引号表示。
__bases__) 经典类与新式类 在Python2中类分为两种: 1、经典类:指的就是没有继承object类的类,以及该类的子类 2、新式类:指的就是继承object类的类,以及该类的子类 在Python3 注意: 在子类中,新建的重名的函数属性,在编辑函数内功能的时候,有可能需要重用父类中重名的那个函数功能,应该是用调用普通函数的方式,即:类名.func(),此时就与调用普通函数无异了,因此即便是self __dict__) obj.f2() 结果: {} Foo.f2 Bar.f1 子类重用父类的功能之直接指定 此时就与调用普通函数无异了,因此即便是self参数也要为其传值 示例2: class OldboyPeople 直到找到第一个匹配这个属性的类为止 子类重用父类的功能之super 理解了继承原理,就可以看一下另一种子类重用父类功能的方法super() 当你使用super()函数时,Python会在MRO列表上继续搜索下一个类 举例: 序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系 str,list,tuple都是序列类型 s=str('hello') l=list([1,2,3]) t=tuple((4,5,6
python数据类型:(按特征划分) 数字类型: ×××:布尔形、长整型L、标准××× 非×××:双精度型、复数、decimal(不是内建类型) 序列类型: 字符串(str) 元组(tuple) 列表( list) 映像类型: 字典(dict) 集合类型: 可变集合(set) 不可变集合(frozenset) python数据类型(按可变性划分) 可哈希的,不可变数据类型: 数字类型 不可变集合(frozenset ) 字符串(str) 元组(tuple) 可变数据类型: 字典(dict) 列表(list) 可变集合(set) python中引号的作用: ‘ ‘ “ “ ''' ''' 单引号和双引号基本没区别 a.issuperset(b) a是否包含b 查询员工信息:模糊查询员工信息,显示匹配的条数,匹配字符串高亮显示。 方法的重载(overload):发生在本类中,两个重名的函数,根据参数的不同,而重载 子类调用父类的构造函数(也就是父类的__init__函数):两种方法: 显示调用:Father.
JS 函数不仅仅是一个普通的函数,与其他语言不同,JS 函数可以赋值给变量,作为参数传递给另一个函数,也可以从另一个函数返回。 之所以是 Animal 类型,是因为 Dog 类的构造函数: Dog.prototype.constructor; // returns Animal 它是 Animal 类型的。 创建正则表达式,有如下两种方式: var re = /ar/; var re = new RegExp('ar'); 上面的正则表达式是与给定字符串集匹配的表达式。 RegEx 中有许多类型的元素,其中一些如下: 字符正则:\w-字母数字, \d- 数字, \D- 没有数字 字符类正则:x-yx-y区间,^x 没有x 数量正则:+ 至少一个、? 尽管 JS 是一种脚本语言,但它有一种提升机制,在这种机制中,JavaScript VM 在运行程序时做两件事: 首先扫描程序,收集所有的变量和函数声明,并为其分配内存空间 通过填充分配的变量来执行程序
解构赋值语法是JavaScript的一种表达式,可以方便的从数组或者对象中快速提取值赋给定义的变量。 获取数组中的值 从数组中获取值并赋值到变量中,变量的顺序与数组中对象顺序对应。 没有展开语法的时候,只能组合使用 push,splice,concat 等方法,来将已有数组元素变成新数组的一部分。 ,并且改变正则表达式的结构有可能改变匹配对象的索引。 这意味着匹配会发生,但不会有任何捕获,并且断言没有包含在整个匹配字段中。例如从价格中捕获货币符号: const reLookahead = /\D(? 因为参数的字面量实际也是 Number 类型的一次实例化,超出安全范围的数字,可能会引起精度丢失。
3.面向对象编程 (object oriented programming) OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单 调用该函数时,会自动传递实参self,它是一个指向实例本身的引用,让实例能访问类中的 属性和方法.__init__()函数中需要的参数,就是实例化类时需要传递的参数 2. 继承是指这样一种能力,它可以使用现有类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展。 19 Animal.animal_talk(c1) 20 Animal.animal_talk(d1) View Code 三、静态方法 @staticmethod 实际上让方法变成与类没关系 ,变成类下的一个方法,不要传self ?
Python的Property详细档案 今天我们就来好好聊聊Python3里面的Property 特性的引入 特性和属性的区别是什么? 在python 中 属性 这个 实例方法, 类变量 都是属性. 比如这段代码: 直接把name 变成类属性 这样做不是很好吗,多简单. 这样写看起来 也没有太大的问题.但是 如果给name 赋值成数字 这段程序也是不会报错. __class__ 开始,而且,仅当类中没有名为 attr 的特性时, Python 才会在 obj 实 例中寻找。 在举一个小例子 比如 有一个货物, 有重量 和 价格 ,需要保证 这两个属性是正数 不能是 0 , 即>0 的值 基础版本的代码: class Goods: def __init__(self 优化后的代码 有没有更好的解决方案呢? 是有的, 我们可以写一个 工厂函数 来返回一个property , 这实际上是两个 property 而已.
JS 函数不仅仅是一个普通的函数,与其他语言不同,JS 函数可以赋值给变量,作为参数传递给另一个函数,也可以从另一个函数返回。 之所以是 Animal 类型,是因为 Dog 类的构造函数: Dog.prototype.constructor; // returns Animal 它是 Animal 类型的。 创建正则表达式,有如下两种方式: var re = /ar/; var re = new RegExp('ar'); 上面的正则表达式是与给定字符串集匹配的表达式。 RegEx 中有许多类型的元素,其中一些如下: 字符正则:\w-字母数字, \d- 数字, \D- 没有数字 字符类正则:[x-y] x-y区间, [^x] 没有x 数量正则:+ 至少一个、? 尽管 JS 是一种脚本语言,但它有一种提升机制,在这种机制中,JavaScript VM 在运行程序时做两件事: 首先扫描程序,收集所有的变量和函数声明,并为其分配内存空间 通过填充分配的变量来执行程序
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 # 表示注释,从这个字符一直到行尾,都会被解析器忽略。 YAML 支持的数据结构有三种。 { animal: 'pets' } Yaml 也允许另一种写法,将所有键值对写成一个行内对象。 hash: { name: Steve, foo: bar } 转为 JavaScript 如下。 以下数据类型都属于 JavaScript 的纯量。 字符串 布尔值 整数 浮点数 Null 时间 日期 数值直接以字面量的形式表示。 { date: new Date('1976-07-31') } YAML 允许使用两个感叹号,强制转换数据类型。 e: !!str 123 f: !! str true 转为 JavaScript 如下。 { e: '123', f: 'true' } 六、字符串 字符串是最常见,也是最复杂的一种数据类型。 字符串默认不使用引号表示。
❞ 对象解构:与数组按照索引位置进行解构不同,对象解构是按照属性名进行解构赋值,如果在当前对象属性匹配不成功则会去对象的原型属性上查找: // 默认写法 let { name: name, age: age u 修饰符,量词才能正确匹配大于 \uFFFF 的字符 /? /u.unicode // true y 修饰符,与 g 修饰符类似也是全局匹配;不同的是 g 是剩余字符中匹配即可,而 y 则是必须在剩余的第一个字符开始匹配才行,所以 y 修饰符也叫黏连修饰符: 参数不能有同名的,函数体内不能用 let 和 const 声明同参数名的变量: function printInfo(name = '布兰', age = 12) {} 使用参数默认值的时候,参数不能有同名的 __proto__ === Animal.prototype // true 子类原型的原型指向父类的原型: // 基于上面的代码 let animal = new Animal() let dog
上面代码可以=号为分界点来理解 =左部分:定义了一个mySum变量,它表示一个函数,接受number类型的 x 、y,最后返回值也是number =右部分:一个函数,接受 number 类型的 x 和 ): number => { return x + y; }; let result = mySum(1, 2) console.log(result); //3 #重载 重载允许一个函数接受不同数量或类型的参数时 在编辑器的代码提示中,可以正确的看到前两个提示。 注意,TypeScript 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面。 >的语法定义任意多个类型变量,具体如下。 这里我有意使用不同的变量名,以表明类型值沿链向上传播,且与变量名无关。 #泛型约束 确保属性存在 当我们在函数中获取length属性,在类型为number时,是没有length的,所以会报错。
number } keyof返回泛型 T 的所有键枚举类型,key是自定义的任何变量名,中间用in链接,外围用[]包裹起来(这个是固定搭配),冒号右侧number将所有的key定义为number类型。 ]: 类型 四、泛型 泛型在 TS 中可以说是一个非常重要的属性,它承载了从静态定义到动态调用的桥梁,同时也是 TS 对自己类型定义的元编程。 泛型的语法格式简单总结如下: 类型名<泛型列表> 具体类型定义 泛型推导与默认值 上面提到了,我们可以简化对泛型类型定义的书写,因为TS会自动根据变量定义时的类型推导出变量类型,这一般是发生在函数调用的场合的 type为string的对象 adopt(dog); // Pass: 函数会根据入参类型推断出type为string 若不适用函数泛型推导,我们若需要定义变量类型则必须指定泛型类型。 ,因为泛型参数匹配上了,使用了infer对应的type type Three = Foo<{a: number, t: () => void}> // () => void,泛型定义是参数的子集,同样适配
# isinstance type issubclass 内置函数: # 1.issubclass() 这个内置函数可判断xxx类是否是yyy类型的子类 # issubclass(子类,父类) ? 精准的返回数据类型 ? 1 # type 精准的返回数据类型 2 def cul(a,b): # 计算两个参数的和(判断是否int float类) 3 if(type(a) == int or type(a) == :任何情况都是方法 静态方法:任何情况都是函数 实例方法:对象使用是方法,类使用是函数 ''' # 反射: # 关于反射, ⼀共有4个函数: # 1. hasattr(obj, str) 判断obj中是否包含 ,"xinchi",chi) # 即原master没有这功能,我新增 'xinchi' 59 60 # 如上可知 setattr与字典类似有就改没有就新增 61 62 # 再来看看删除 delattr
扫码关注云+社区
领取腾讯云代金券