[置顶] python高级编程(六)--元类、内建属性
2017-10-03 16:37
190 查看
1. 元类
类也是对象在理解元类之前,我们需要掌握python中的类。在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在python中这一点仍然成立:
>>> class Obj(object): … pass … >>> my_obj= Obj() >>> print my_obj <__main__.Obj obj at 0x8974f2c>
但是在python类还远不止如此。类同样也是一种对象。是的,没错,就是对象。只有你使用关键字class,python解释器在执行的时候就会创建一个对象。
动态地创建类
因为类也是对象,你可以在运行时动态的创建它们,就像其他任何对象一样。首先,你可以再函数中创建类,使用class关键字即可。
>>> def choose_class(name): if name == 'foo': class Foo(object): pass return Foo # 返回的是类,不是类的实例 else: class Bar(object): pass return Bar >>> MyClass = choose_class('foo') >>> print MyClass # 函数返回的是类,不是类的实例 <class '__main__'.Foo> >>> print MyClass() # 你可以通过这个类创建类实例,也就是对象 <__main__.Foo object at 0x89c6d4c>
但这不够动态,因为你仍然需要自己编写整个类的代码。由于类也是对象,所以它们必须是通过什么东西来生成的才对。当你使用class关键字时,python解释器自动创建这个对象。但就和python中的大多数事情一样,python仍然提供给你手动处理的方法。还记得内建函数type吗?这个古老但强大的函数就够让你知道一个对象的类型是什么:
>>> print type(1) <type 'int'> >>> print type("1") <type 'str'> >>> print type(ObjectCreator) <type 'type'> >>> print type(ObjectCreator()) <class '__main__.ObjectCreator'>
type有一种完全不同的功能,它也能动态的创建类。
type可以接受一个类的描述作为参数,然后返回一个类。(可能你会觉得根据传入参数的不同,同一个函数拥有两种完全不同的用法是一件很傻的事情,但这在python中是为了保持向后兼容性)
tpye可以像这样工作:
type(类名,由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
Test2 = type("Test2",(),{}) #定了一个Test2类 In [5]: Test2() #创建了一个Test2类的实例对象 Out[5]: <__main__.Test2 at 0x10d406b38>
使用type创建带有属性的类
type接受一个字典来为类定义属性
>>> Foo = type("Foo",(),{"bar":True}) 可以翻译为: >>> class Foo(object): ... bar = True
说明:type的第2个参数,元组中是父类的名字,而不是字符串。添加的属性的类属性,并不是实例属性
使用type创建带有方法的类
def echo_bar(self): print(self.bar) #让FooChild类中的echo_bar属性,指向了上面定义的函数 FooChild = type("FooChild",(Foo,),{"echo_bar":echo_bar})
添加静态方法
In [36]: @staticmethod ...: def testStatic(): ...: print("static method ....") ...: In [37]: Foochild = type('Foochild', (Foo,), {"echo_bar":echo_bar, "testStatic": testStatic}) In [38]: fooclid = Foochild() In [39]: fooclid.testStatic Out[39]: <function __main__.testStatic>
添加类方法
In [42]: @classmethod ...: def testClass(cls): ...: print(cls.bar) ...: In [43]: Foochild = type('Foochild', (Foo,), {"echo_bar":echo_bar, "testStatic":testStatic, "testClass":testClass})
什么是元类呢?
元类就是用来创建类的“东西”。你创建类就是为了创建类的实例对象,不是吗?但是我们已经学习到了python中的类也是对象。好吧,元类就是用来创建这些类(对象)的,元类就是类的类,你可以这样理解为:
MyClass = MetaClass() MyObject = MyClass()
你已经看到了type可以让你像这样做:
MyClass = type('MyClass', (), {})
这是因为函数type实际上是一个元类。type就是python在背后用来创建所有类的元类。现在你想指定为什么type全部采用小写形式而不是Type呢?好吧这是为了和str保持一致性,str是用来创建字符串对象的类,而int是用来创建整数对象的类。type就是创建类对象的类。你可以通过检查
__class__属性来看到这一点。python中所有的东西,注意,我是指所有的东西–都是对象。这包括整数、字符串、函数以及类。它们全部都是对象。而它们都是一个类创建而来。
2. 内建属性
常用专有属性 | 说明 | 触发方式 |
---|---|---|
__init__ | 构造初始化函数 | 创建实例后,赋值时使用,在__new__后 |
__new__ | 生成实例所需属性 | 创建实例时 |
__class__ | 实例所在的类 | 实例.__class__ |
__str__ | 实例字符串表示,可读性 | print(类实例),如没实现,使用repr结果 |
__repr__ | 实例字符串表示,准确性 | 类实例 回车 或者 print(repr(类实例)) |
__del__ | 析构 | del删除实例 |
__dict__ | 实例自定义属性 | vars(实例.__dict__) |
__doc__ | 类文档,子类不继承 | help(类或实例) |
__getattribute__ | 属性访问拦截器 | 访问实例属性时 |
__bases__ | 类的所有父类构成元素 | 类名.__bases__ |
3. 库
常用标准库标准库 | 说明 |
---|---|
builtins | 内建函数默认加载 |
os | 操作系统接口 |
sys | Python自身的运行环境 |
functools | 常用的工具 |
json | 编码和解码 JSON 对象 |
logging | 记录日志,调试 |
multiprocessing | 多进程 |
threading | 多线程 |
copy | 拷贝 |
time | 时间 |
datetime | 日期和时间 |
calendar | 日历 |
hashlib | 加密算法 |
random | 生成随机数 |
re | 字符串正则匹配 |
socket | 标准的 BSD Sockets API |
shutil | 文件和目录管理 |
glob | 基于文件通配符搜索 |
扩展库 | 说明 |
---|---|
requests | 使用的是 urllib3,继承了urllib2的所有特性 |
urllib | 基于http的高层库 |
scrapy | 爬虫 |
beautifulsoup4 | HTML/XML的解析器 |
celery | 分布式任务调度模块 |
redis | 缓存 |
Pillow(PIL) | 图像处理 |
xlsxwriter | 仅写excle功能,支持xlsx |
xlwt | 仅写excle功能,支持xls ,2013或更早版office |
xlrd | 仅读excle功能 |
elasticsearch | 全文搜索引擎 |
pymysql | 数据库连接库 |
mongoengine/pymongo | mongodbpython接口 |
matplotlib | 画图 |
numpy/scipy | 科学计算 |
django/tornado/flask | web框架 |
xmltodict | xml 转 dict |
SimpleHTTPServer | 简单地HTTP Server,不使用Web框架 |
gevent | 基于协程的Python网络库 |
fabric | 系统管理 |
pandas | 数据处理库 |
scikit-learn | 机器学习库 |
相关文章推荐
- [置顶] Android--(6)--详解ImageButton属性
- [置顶] 检验-会话cookie中缺少HttpOnly属性
- [置顶] 页面显示LCD液晶字体,特殊字体,@font-face属性详细用法,配图
- [置顶] 什么叫构造函数,原型属性和方法,实例属性和方法以及构造函数原型和实例三者关系
- [置顶] xamarin android自定义标题栏(自定义属性、回调事件)
- [置顶] python高级编程(一)--多线程编程
- 变量声明置顶规则、函数声明及函数表达式和函数的arguments属性初始化
- [置顶] python高级编程(二)--网络编程
- [置顶] 【Python】使用skimage完成二值图像连通区域标记及属性提取
- [置顶] Android自定义View(六) -- 属性动画(上)
- [置顶] xamarin android自定义标题栏(自定义属性、回调事件)
- python中7种实现单例模式的方法:staticmethod、classmethod、类属性方法、__new__、装饰器、元类、名字覆盖
- [置顶] python高级编程(八)--正则表达式
- [置顶] Property属性对象目录 总览概括
- [置顶] 学习笔记之——Android常用属性归纳
- [置顶] python高级编程(七)--HTTP协议
- [置顶] Android 网络属性详解
- Python属性、方法和类管理系列之----元类
- [置顶] xmlns:android作用以及自定义布局属性
- [置顶] python高级编程(三)--迭代、生成器