No1:

类和实例

__init__方法的第一个参数永远是self,表示创建的实例本身;init相当于构造函数

No2:

数据封装

No3:

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问

在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name____score__这样的变量名。

Python解释器对外把__name变量改成了_(类名)_name,所以,仍然可以通过_(类名)__name来访问__name变量;但是不同版本的Python解释器可能会把__name改成不同的变量名。

No4:

不知道为什么拿不出值

No5:

继承

No6:

多态

No7:

No8:

判断对象类型

能用type()判断的基本类型也可以用isinstance()判断:

No9:

如果要获得一个对象的所有属性和方法,可以使用dir()函数

No10:

动态给class加上功能

No11:

__slots__限制class实例能添加的属性

No12:

@property是为了s.getScore变为简单实用s.score

上面的birth是可读写属性,而age就是一个只读属性

No13:

多继承

No14:

定制类__str__

直接显示变量调用的不是__str__(),而是__repr__()

No15:

用__iter__实用斐波那契

No16:

没有找到类的属性之外,可以使用__getattr__

No17:

__call__实例调用方法

No18:

枚举

@unique装饰器可以帮助我们检查保证没有重复值。

No19:

type()函数既可以返回一个对象的类型,又可以创建出新的类型

No20

metaclass:先定义metaclass,就可以创建类,最后创建实例。

__new__()方法接收到的参数依次是:

  1. 当前准备创建的类的对象;

  2. 类的名字;

  3. 类继承的父类集合;

  4. 类的方法集合。

 No21:

简单的ORM框架

class Field(object):def __init__(self, name, column_type):self.name = nameself.column_type = column_typedef __str__(self):return '<%s:%s>' % (self.__class__.__name__, self.name)

class StringField(Field):def __init__(self, name):super(StringField, self).__init__(name, 'varchar(100)')class IntegerField(Field):def __init__(self, name):super(IntegerField, self).__init__(name, 'bigint')

class ModelMetaclass(type):def __new__(cls, name, bases, attrs):if name=='Model':return type.__new__(cls, name, bases, attrs)print('Found model: %s' % name)mappings = dict()for k, v in attrs.items():if isinstance(v, Field):print('Found mapping: %s ==> %s' % (k, v))mappings[k] = vfor k in mappings.keys():attrs.pop(k)attrs['__mappings__'] = mappings # 保存属性和列的映射关系attrs['__table__'] = name # 假设表名和类名一致return type.__new__(cls, name, bases, attrs)

class Model(dict, metaclass=ModelMetaclass):def __init__(self, **kw):super(Model, self).__init__(**kw)def __getattr__(self, key):try:return self[key]except KeyError:raise AttributeError(r"'Model' object has no attribute '%s'" % key)def __setattr__(self, key, value):self[key] = valuedef save(self):fields = []params = []args = []for k, v in self.__mappings__.items():fields.append(v.name)params.append('?')args.append(getattr(self, k, None))sql = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(params))print('SQL: %s' % sql)print('ARGS: %s' % str(args))

class User(Model):# 定义类的属性到列的映射:id = IntegerField('id')name = StringField('username')email = StringField('email')password = StringField('password')# 创建一个实例:
u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd')
# 保存到数据库:
u.save()

输出如下

Found model: User
Found mapping: email ==> <StringField:email>
Found mapping: password ==> <StringField:password>
Found mapping: id ==> <IntegerField:uid>
Found mapping: name ==> <StringField:username>
SQL: insert into User (password,email,username,id) values (?,?,?,?)
ARGS: ['my-pwd', 'test@orm.org', 'Michael', 12345]

ModelMetaclass中,一共做了几件事情:

  1. 排除掉对Model类的修改;

  2. 在当前类(比如User)中查找定义的类的所有属性,如果找到一个Field属性,就把它保存到一个__mappings__的dict中,同时从类属性中删除该Field属性,否则,容易造成运行时错误(实例的属性会遮盖类的同名属性);

  3. 把表名保存到__table__中,这里简化为表名默认为类名。

No22:

抓异常

使用try...except捕获错误还有一个巨大的好处,就是可以跨越多层调用,比如函数main()调用foo()foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处

也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally的麻烦

python的错误日志是从上往下看

No23:

抛异常用raise相当于java的thorws

No24:

import logging
logging.basicConfig(level=logging.INFO)

logging的好处,它允许你指定记录信息的级别,有debuginfowarningerror等几个级别

 No25:

调试:l-查看代码,n-单步执行,p-查看变量的值

#err.py
import pdb
s='0'
n=int(s)
pdb.set_trace()
print(10/n)

No26:

比较好的Python IDE有:

Visual Studio Code:https://code.visualstudio.com/,需要安装Python插件。

PyCharm:http://www.jetbrains.com/pycharm/

No27:

单元测试

mydict.py

class Dict(dict):def __init__(self,**kw):super().__init__(**kw)def __getattr__(self,key):try:return self[key]except KeyError:raise AttributeError(r"'Dict' object has no attribute '%s'" % key)def __setattr__(self,key,value):self[key]=value

mydict_test.py

import unittestfrom mydict import Dictclass TestDict(unittest.TestCase):def test_init(self):d = Dict(a=1,b='test')self.assertEqual(d.a,1)self.assertEqual(d.b,'test')self.assertTrue(isinstance(d,dict))def test_key(self):d = Dict()d['key']='value'self.assertEqual(d.key,'value')def test_attr(self):d = Dict()d.key = 'value'self.assertTrue('key' in d)self.assertEqual(d['key'],'value')def test_keyerror(self):d = Dict()with self.assertRaises(KeyError):value = d['empty']def test_attrerror(self):d = Dict()with self.assertRaises(AttributeError):value = d.emptydef setUp(self):print('setUp...')def tearDown(self):print('tearDown...')

运行结果

No28:

文档测试

class Dict(dict):'''Simple dict but also support access as x.y style.>>> d1 = Dict()>>> d1['x'] = 100>>> d1.x100>>> d1.y = 200>>> d1['y']200>>> d2 = Dict(a=1, b=2, c='3')>>> d2.c'3'>>> d2['empty']Traceback (most recent call last):...KeyError: 'empty'>>> d2.emptyTraceback (most recent call last):...AttributeError: 'Dict' object has no attribute 'empty''''def __init__(self, **kw):super(Dict, self).__init__(**kw)def __getattr__(self, key):try:return self[key]except KeyError:raise AttributeError(r"'Dict' object has no attribute '%s'" % key)def __setattr__(self, key, value):self[key] = valueif __name__=='__main__':import doctestdoctest.testmod()

当模块正常导入时,doctest不会被执行。只有在命令行直接运行时,才执行doctest。所以,不必担心doctest会在非测试环境下执行

No29:

读文件

f = open('/Users/michael/test.txt', 'r')
f.read()
f.close()with open('/path/to/file', 'r') as f:print(f.read())

非UTF-8编码的文本文件

f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
f.read()
f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

写文件

f = open('/Users/michael/test.txt', 'w')
f.write('Hello, world!')
f.close()with open('/Users/michael/test.txt', 'w') as f:f.write('Hello, world!')

No30:

StringIO读写

>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!>>> from io import StringIO
>>> f = StringIO('Hello!\nHi!\nGoodbye!')
>>> while True:
...     s = f.readline()
...     if s == '':
...         break
...     print(s.strip())
...
Hello!
Hi!
Goodbye!

BytesIO读写

>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'>>> from io import BytesIO
>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
>>> f.read()
b'\xe4\xb8\xad\xe6\x96\x87'

No31:

操作文件

# 查看当前目录的绝对路径:
>>> os.path.abspath('.')
'/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
>>> os.rmdir('/Users/michael/testdir')

拆分路径

>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')

扩展名

>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')

# 对文件重命名:
>>> os.rename('test.txt', 'test.py')
# 删掉文件:
>>> os.remove('test.py')

No32:

要列出所有的.py文件

>>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py']

No33:

序列化

No34:

JSON和python对比

No35:

类转为json

json转为类

【python】面向对象编程相关推荐

  1. 这可能是Python面向对象编程的最佳实践

    作者 | 崔庆才 来源 | 进击的Coder(ID:FightingCoder) Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了 ...

  2. Python面向对象编程:类继承和其衍生术语

    Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...

  3. 《Python面向对象编程指南》——1.2 基类中的__init__()方法

    本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...

  4. 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

    前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...

  5. python对象编程例子-这是我见过最详细的Python面向对象编程!建议收藏!

    原标题:这是我见过最详细的Python面向对象编程!建议收藏! 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 ...

  6. python面向对象编程的优点-Python面向对象编程——总结面向对象的优点

    Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...

  7. python编程基础是什么-Python面向对象编程基础解析(一)

    1.什么是面向对象 面向对象(oop)是一种抽象的方法来理解这个世界,世间万物都可以抽象成一个对象,一切事物都是由对象构成的.应用在编程中,是一种开发程序的方法,它将对象作为程序的基本单元. 2.面向 ...

  8. 【Python基础】Python 面向对象编程(上篇)

    我的施工计划图 已完成专题包括: 1我的施工计划 2数字专题 3字符串专题 4列表专题 5流程控制专题 6编程风格专题 7函数使用专题 今天是面向对象编程的上篇:基础专题 Python 面向对象编程 ...

  9. Python 面向对象编程基础

    Python面向对象编程 简介:面向对象编程--Object Oriented Programming,简称 OOP,是一种程序设计思想.OOP 把对象作为程序的基本单元,一个对象包含了数据和操作数据 ...

  10. python面向对象编程138讲_Python面向对象编程简单讲解

    学习目标: 1-面向对象编程 2-类和对象 3-对象的属性和方法 4-类的特性 Python面向对象编程 一种编程程序的设计思想,把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数.把计算机 ...

最新文章

  1. 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)
  2. Linux系统解决网络问题的笔记
  3. 【渝粤题库】陕西师范大学400006 公共关系学 作业(专升本)
  4. Replace Error Code with Exception(以异常取代错误码)
  5. 诗与远方:无题(六十四)- 杂诗
  6. HTML的DOM和浏览器的BOM
  7. Android Studio查看应用数字签名-android学习之旅(76)
  8. android api 打开慢,为什么下了android 4.1 的SDK后在本地用浏览器看api说明文档时,浏览器打开api的html文件很慢?试了好几款浏览器都一样。为什么?...
  9. 都说做作设计要多看多参考,那哪里才能找到优秀原创设计作品?
  10. 手机相机里面的m_2020拍立得相机选购指南 富士乐魔徕卡推荐 总有一款适合你...
  11. “霸王级”寒潮来袭 通信业紧急部署确保网络安全
  12. 满屋花网页代码_成为更好的程序猿!2020年给网页开发人员的32条建议
  13. android动画之从源码角度分析动画原理
  14. Visio2013里面的大括号
  15. 【经验】JavaScript
  16. html页面图片延迟加载,实现图片懒加载的几种方法
  17. 迅雷服务器IP地址列表的获取办法
  18. 2017总结与2018展望
  19. 详解JAVA实现支付宝接口编程
  20. Wi-Fi Display

热门文章

  1. Atitit 2017年的技术趋势与未来的大技术趋势 1. 2017年的技术趋势 2 1.1. Web not native 2 1.2. 更加移动优先 ,,more spa 3 1.3. Ar
  2. Atitit.python web环境的配置 attilax 总结
  3. Atitit.注解解析(1)---------词法分析 attilax总结 java .net
  4. paip.jdk1.4 1.5(5.0) 1.6(6.0) 7.0 8.0特点比较与不同
  5. PAIP.ecshop file_put_contents Warning notice解决方法
  6. 当前不会命中断点 还没有为该文档加载任何符号
  7. 我踩过的支付通道的“坑”(一)
  8. 转: Rust中的Pin详解 【Rust语言中文社区】
  9. 蜘蛛侠的入侵:互联网公司robots协议法律指南
  10. IP地址与子网掩码划分的心得