Python实例变量和类变量
类变量(类属性):
类变量属于类所有,所有实例共享一个变量
实例变量(实例属性)
实例变量属于各个实例所有,相互不干扰
1、实例属性
给实例绑定属性的方法可以通过self和实例变量
|
|
2、类属性
类属性归类所有,但所有实例都可以访问它
|
|
Changing & Building
类变量(类属性):
类变量属于类所有,所有实例共享一个变量
实例变量(实例属性)
实例变量属于各个实例所有,相互不干扰
1、实例属性
给实例绑定属性的方法可以通过self和实例变量
|
|
2、类属性
类属性归类所有,但所有实例都可以访问它
|
|
参考自廖雪峰的Python教程
Python自省——-在运行时能够获得对象的类型
type()返回对应的class类型
|
|
不带参数
带参数
|
|
这里看下len()
len()函数返回字符长度
|
|
|
|
看个函数
|
|
判断a数据类型是不是list
|
|
|
|
获取不存在的属性,会抛出AttributeError
|
|
可以传入一个默认参数,不存在就抛出默认参数
|
|
面向对象编程——-Object Oriented Programming(OOP)
Python面向对象编程三大特点:
1、数据封装
这里我们定义一个Cat类,每个实例都可以拥有name和age属性,我们可以调用内部方法来访问这些数据,这样就把数据封装起来了,这些封装数据的函数本身是与Cat类相关联的,我们称之为“类的方法”
|
|
封装的另外一个好处就是可以给Cat类再增加一个新的方法
|
|
2、继承
继承的好处时子类获得父类所有的功能,这里先定义一个Animal类
|
|
这里再定义Cat类和Dog类,它们都继承自Animal,Animal是Cat和Dog的父类(超类或基类),而Cat和Dog是Animal的子类。Cat和Dog继承Animal后自动获得了Animal类的run方法
|
|
这里我们给子类增加run方法,当子类和父类都存在run方法时,子类覆盖掉父类方法,所以输出是
Cat is running!
Dog is running!
|
|
3、多态
当我们定义class的时候就定义了一种数据类型,这里用isinstance()函数来判断对象是否是已知的类型
|
|
判断都为True,这里可以试下isinstance(c, Animal)是什么结果,Cat的实例c继承自Animal,所以c也是Animal类型
|
|
在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行
Cat可以被看成Animal,但Animal不能被看成Cat
isinstance(c, Cat)
|
|
再编写一个函数来来理解多态,每当我们传入实例,就打印出各个类相应的结果
|
|
这里我们再增加Lion子类
|
|
Animal类型有run方法,只要传入的任意类型是animal类或者子类就会自动调用自己的run方法
鸭子类型
我们再增加一个子类,它不是animal类型,只要它有一个run()方法就可以了(只关心它的行为,而不关心它到底是不是animal)
|
|
完整代码
|
|
用Django搭建博客
欢迎访问 www.treehl.top ,此博客仅作为项目展示
一、后台admin开发
二、前台开发
三、增加插件
四、部署项目
刚刚学习了Unittest模块,这里简单总结下
函数测试
可通过测试
先创建一个要测试的代码,name_function.py
|
|
接下来,我们创建一个用来检查get_formatted_name函数在给出名和姓时,能否正确地工作
|
|
.表示有一个测试通过了,接下来一行指出python运行了一个测试,消耗时间不到0.003秒
不可通过测试
这里修改下get_formatted_name函数,使其能够处理中间名
|
|
再次测试代码会出现报错,它告诉你还少了一个位置参数
测试通过了意味着函数的行为是对的,测试未通过意味着新编写的代码有错,因此测试未通过时,不要修改测试,而应该修改代码,这里我们把中间名变成可选的来避免代码错误
修改name_function.py
再次测试,代码测试完成
添加新测试
在测试代码中添加一个新方法,用于添加中间名的测试
|
|
再次测试,两个测试都通过了!!!
方法 | 用途 |
---|---|
assertEqual(a, b) | 核实a==b |
assertNotEqual(a, b) | 核实a != b |
assertTrue(x) | 核实x为True |
assertFalse(x) | 核实x为False |
assertIn(item, list) | 核实item在list中 |
assertNotIn(item, list) | 核实item不在list中 |
类测试
先编写一个类做测试,关于帮助管理匿名调查的类
测试AnonymousSurvey类
核实单个答案的测试
|
|
核实多个答案的测试,我们在TestAnonymouseSurvey类中再添加一个方法
|
|
setUp方法
使用setUp()来创建一个调查对象和一组答案,供test_store_single_response()和test_store_three_responses()使用
可以在setUp()方法中创建一系列实例并设置它们的属性,再在测试方法中直接使用这些实例,有点类似于Django中的ClassBaseView让代码更加容易扩展而不是修改代码
|
|
前面一节开发了admin基础的功能,这一节我们需要开发后台网页标题和名字,以及把admin模型迁移到新的站点cus_admin上
在Myblog目录下新建custom_site.py
为了迁移到新站点上,我们需要在blog/admin.py中添加如下代码,把blog应用注册到新站点上
接下里需要重新配置一个url
运行服务查看下
config和comment应用迁移到新站点上也是同样的步骤
接下来,我们再创建管理界面的操作键,编辑blog/admin.py,给post、category、tag新建一个operator函数,operator创建完成后不要忘记在list_display中添加operator
我们看到文章编辑页面的摘要一栏非常窄,这里创建一个表单来扩展写字框,在blog目录下新建adminforms.py
|
|
将form配置进admin
|
|
因为多人博客系统,所以就要保证数据属于当前用户,这里创建save_model方法,
重写adminforms.py
这里有个问题,save_model方法需要添加到用户的每一个类下面,以此来保证数据属于当前用户,但这样就会出现大量的相同代码,以后出现修改就要修改多处,这时候需要创建admin的一个父类BaseOwnerAdmin来避免过多的代码,让代码有伸缩性
|
|
编辑admin.py
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true