python高级编程(六)--元类、内建属性

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操作系统接口
sysPython自身的运行环境
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爬虫
beautifulsoup4HTML/XML的解析器
celery分布式任务调度模块
redis缓存
Pillow(PIL)图像处理
xlsxwriter仅写excle功能,支持xlsx
xlwt仅写excle功能,支持xls ,2013或更早版office
xlrd仅读excle功能
elasticsearch全文搜索引擎
pymysql数据库连接库
mongoengine/pymongomongodbpython接口
matplotlib画图
numpy/scipy科学计算
django/tornado/flaskweb框架
xmltodictxml 转 dict
SimpleHTTPServer简单地HTTP Server,不使用Web框架
gevent基于协程的Python网络库
fabric系统管理
pandas数据处理库
scikit-learn机器学习库
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值