Python高级语法中,由一个yield关键词生成的generator生成器,是精髓中的精髓.它虽然比装饰器.魔法方法更难懂,但是它强大到我们难以想象的地步:小到简单的for loop循环,大到代替多线程做服务器的高并发处理,都可以基于yield来实现. 理解yield:代替return的yield 简单来说,yield是代替return的另一种方案: return就像人只有一辈子,一个函数一旦return,它的生命就结束了 yield就像有"第二人生"."第三人生"…
知识点: 一.什么是property属性? 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法,Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回. 二.property属性的有两种方式 : 装饰器 即:在方法上应用装饰器 类属性 即:在类中定义值为property对象的类属性 1.使用装饰器时经典类和新式类的区别: 经典类中:property属性只有装饰器@property这一个 新式类中:具有三种@property装饰器,…
无论是类还是实例,一切皆是对象. Python是强动态语言,和java在这点上有所不同. class Ab(): a = 666 # 定义类对象Ab,自带属性a,值为666 # 使用Ab.__dict__可以查看类Ab的属性 us1 = Ab() us2 = Ab() # 定义两个实例对象us1.us2,这两个实例自身并不具备任何属性 # 只有在__init__中定义了self.arg=xxx的情况下,实例默认会具备arg属性 动态语言中,属性自带操作方法:获取(读).设置(写):还可以定义删除…
Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们先来简单的了解下面向对象的一些基本特征. 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定…
一.前言 了解JavaScript面向对象,需要先了解三个名词: 构造函数,实例对象和原型对象. 注意:JavaScript中没有类(class)的概念,取而代之的是构造函数,两者类似却又有很大的差别. 先上代码,最常用的: function Person(name, age) { this.name = name; this.age = age; this.eat= function() { alert('吃西红柿') } } var person1 = new Person('小米', 28…
构造函数,实例对象和原型对象,三者关系 构造函数里面有原型(prototype)属性,即原型对象 原型对象里的constryctor构造器指向构造函数 通过构造函数,实例化,创建的就是实例对象. 实例对象通过__proto__属性调用原型对象里面的方法 构造函数可以实例化对象 构造函数中有一个属性叫prototype, 是构造函数的原型对象 构造函数的原型对象(prototype)中有一个constructor构造器, 这个构造器指向的就是自己所在的原型对象所在的构造函数 实例对象的原型对象(_…
一. 语法释义 调用方法:实例. __dict__属性 __dict__属性返回的是实例对象中当前已经定义的所有自定义实例变量的名和值,用字典存储,每个元素为一个"实例变量名:值"对,如果某个方法中也新定义了实例变量但还没执行,则该实例变量不会列出. 注意:是实例变量不含特殊变量.不含方法,但包含父类中定义的实例变量. 二. 举例说明 定义Vehicle类和Car类,Vehicle类是父类,Car从Vehicle类继承.在Vehicle类构造方法中定义了实例变量:wheelcount.…
@ 目录 1.为什么要掌握元类 2.正文 关于作者 1.为什么要掌握元类 在django中编写models的时候遇到了元类的相关操作 并且在mini-web框架编写的时候也遇到了相关的问题 意识到深入理解元类非常的重要所以补票重学 学习且引用来自博客:https://www.cnblogs.com/intimacy/p/8119449.html 2.正文 python中一切都是对象,类也是对象 那么意味着,类可以执行以下操作 1)将他赋值给一个变量 2)拷贝他 3)给他设置属性 4)将他当做方法…
如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性. 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性: class Student(object): __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称 然后,我们试试: >>> s = Student() # 创建新的实例 >>> s.name = 'M…
Python是个很灵活的语言,光看它的类和实例间属性的访问机制就可以看出这一点,不过这一点还真的不好理解,做了些测试之后我的理解是这样的: 实例在访问class属性时,先检索自己的names, 如果有的话就直接取出,没有的话就去找class的names里面找,找不到就是error啦 class Pclass(object): """docstring for Pclass""" num = 10 def __init__(self): super…
实例是具象化的类,它可以作为类访问所有静态绑定到类上的属性,包括类变量与方法,也可以作为实例访问动态绑定到实例上的属性. 实例1: class A: work = list("hello") kind = list("world") another = 1 def test1(self): print(self.work, self.kind, self.another) self.work[0], self.kind [0] = "t", &q…
@ 目录 1.说明 2.代码 关于作者 1.说明 property属性,返回的是值 不是callable的,也就是不能使用方法来调用 只能传入self,不能传入其他 用处,能返回局部数据,比如当分页的时候 上面的为get方法,还有set方法和delete方法 当del后,再次调用会抛异常 property就相当于javabean里面的getter,setter 一共有两种方法:装饰器,类属性 第二种方法可以使用doct,但是调用的时候使用类来调用 使用property能简化数据获取的流程 2.代…
@ 目录 1.说明 2.代码 关于作者 1.说明 python中属性:类属性,实例属性 方法:类方法,实例方法,静态方法 想修改类属性,只能是类方法,因为只有类方法把cls(类)传入数据里面 静态方法也就是个普通的方法,为了方便而已 实例方法,不能通过类来直接调用,要调用也可以self = 对象名 具体下面 2.代码 class Provice(object): #类属性 country = "china" def __init__(self,name): #实例属性 self.nam…
# -*- coding: UTF-8 -*- class Employee: def __init__(self, name, salary): self.name = name self.salary = salary def displayCount(self): pass def displayEmployee(self): pass "创建 Employee 类的第一个对象" emp1 = Employee("Zara", 2000) "创建 E…
@ 目录 1.说明 2.代码 关于作者 1.说明 上下文管理器 这里使用with open操作文件,让文件对象实现了自动释放资源.我们也能自定义上下文管理器,通过__enter__()和__exit__()这两个魔术方法来自定义的操作文件 当有上下文使用的场景的时候,如打开一个东西要关闭,像等文件等资源,就可以使用这种方式去定义一个上下文管理器 2.代码 class File(): def __init__(self,filename,mode): self.filename = filenam…
@ 目录 1.说明 2.代码 关于作者 1.说明 常用的一些魔法方法如下 所谓魔法方法,就是调用的时候 不好好正常调用 2.代码 class Test: """ 我是___doc____ """ class_index = 0 def __init__(self,index): self.index = index print("index") def __call__(self, *args, **kwargs): prin…
@ 目录 1.说明 2.代码 关于作者 1.说明 使用__dict__魔法方法 可以看到所有的属性,包括公有的,私有的,保护的等等 不能调用的原因就是,解释器把名字属性给重组了 其实是可以访问到的 2.代码 class hehe: def __init__(self): self.__name = 1#__代表私有 a = hehe() print(a.__dict__) print(a._hehe__name) 关于作者 个人博客网站 个人GitHub地址 个人公众号:…
def DeleteObjectAllProperties(objectInstance): if not objectInstance: return listPro =[key for key in objectInstance.__dict__.keys()] for key in listPro: objectInstance.__delattr__(key)…
1.Python面向对象 创建类 使用class语句来创建一个新类,class之后为类的名称并以冒号结尾,如下实例: class ClassName: '类的帮助信息' #类文档字符串 class_suite #类体 实例: class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def…
python中几个比较难懂概念进阶. 迭代器 实现了迭代器协议的容器对象,基于如下两个方法: __next__:返回容器的下一个元素 __iter__:返回迭代器本身 由此可见,如果要自定义一个迭代器,需要编写一个具有next方法的类,只要这个类提供返回迭代器实例的iter特殊方法: class CountDown(object): def __init__(self, step): self.step = step def __next__(self): if self.step <= 0:…
#coding:utf-8 #定义一个装饰器函数 def doc_func(func): #包裹函数(闭包) def warpfunc(): #做一些额外的事情 print "%s called" %(func.__name__) func() return warpfunc @doc_func def foo(): print "hello" @doc_func def bar(): print "nihao" if __name__== &q…
1.解压序列赋值给多个变量 p = (4, 5, 6) x, y , z = p # x = 4, y = 5, z = 6 若可迭代对象超过变量个数,会抛出ValueError 用处:可以解压赋值任何可迭代对象(包括列表,元组,字符串,文件对象,迭代器,生成器) 2.解压可迭代对象赋值多个变量 p = (4, 5, 6) x, *y = p # x = 4, y = [5, 6] 此方法可防止ValueError,y变量永远是列表类型,*y可以在任意位置 用处: 1.专门用于解压不确定个数或者…
@ 目录 1.说明 2.代码 关于作者 1.说明 __a(私有):只能在类的内部使用,对象使用,但是子类不允许使用,不能导入到其他包 a(protected):可以在子类使用,可以通过对象访问,不能导入其他包 a:没有要求,就是自己定义的区别名字而已 2.代码 test.py a = 1 a_ = 1 __a = 1 _a = 1 main.py from test import * import test print(a) print(a_) print(test._a) print(test…
理论:装饰器就是运行一个函数之前首先运行装饰器函数,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能. 1.单个装饰器装饰一个函数:通用装饰器看下面代码 def verify(func): def call_fun(*args, **kwargs): print('权限验证1') return func(*args, **kwargs) return call_fun…
知识点:GIL全局解释器锁其实和Python没有任何关系,是由于当初编写Python解释器时留下的,它只对多线程有影响,GIL保证同一时刻只有一个线程在运行,即使是多核配置电脑,同一时刻也只会让一个线程运行,这就发挥不了多核cpu的功能了,一般Python进行I/O(读取和写入)密集型任务时使用多线程能发挥出多线程的好处,因为I/O操作会有等待耗时时间,GIL在耗时等待中会被释放,去执行另一个I/O操作,如果做得是计算密集型任务,就发挥不了多线程的好处了,因为计算密集型是没有耗时时间的…
@ 目录 1.说明 2.代码 关于作者 1.说明 在开发程序的过程中,往往使用sys.path去验证下导入的目录,返回的是列表 先后顺序,就是扫描的先后顺序 ,也可以加入搜索路径 import有个特点防止重复导入 import是把包拷贝一份放在内存中,所以当代码改变的时候,程序运行不会变 重新导入也不会变,需要重新导入的使用imp的reload模块 还有 from 模块 导入 属性 属性 = .. 此时模块内的属性不会更改,只是复制了一份,如果是可变数据类型,那么使用append之类的话会更改…
什么叫闭包?通俗来说就是函数里嵌套函数,从表现形式来看,内部函数引用外部函数的作用域里的变量,那么内部函数就称为闭包 举例说明: 1.闭包=函数块+定义函数时的环境,inner就是函数块,x就是环境 def outer(x): def innner(y): return x+y return innner a = outer(1) # 调用outer函数返回内部函数inner返回的的函数变量 print(a(2)) # 通过函数变量传参并运行内部函数,然后返回函数结果运行结果:3 2.闭包不可以…
知识点:深浅拷贝,浅拷贝拷贝的是最顶层的东西,深拷贝是拷贝最深层的东西,光说可能理解不了,看下图 1.拷贝可变类型 2.拷贝不可变类型 3.拷贝元祖,元组内数据是可变类型…
@ 目录 1.说明 2.代码 关于作者 1.说明 使用类的魔法方法__mro__ 可以查看他的父类调用顺序 还有调用父类的构造方法的时候,使用super调用,里面有C3算法支持,不会重复调用相同的祖先类 2.代码 class Parent(object): def __init__(self,name,*args,**kwargs): print("Parent的init开始调用") self.name = name print("Parent的init结束调用")…
@ 目录 1.说明 2.代码 关于作者 1.说明 任何可变数据类型都牵扯到深浅拷贝 但是元组,常数等,不可变数据类型,无论浅拷贝,深拷贝都是指向 不管如何嵌套,一旦牵扯到可变数据类型,都会有深浅区别 特别注意,元组切片为浅拷贝,反正可变数据类型没使用deepcopy一律浅拷贝 浅拷贝: 一个变量名等于另一个东西就一定是指向,浅拷贝是拷贝顶层的->copy.copy() 深拷贝: 是全部都拷贝copy.deepcopy 2.代码 # a = 1 # b = a # print(id(a),id(b…