python高级编程(六)--元类、内建属性
来源:互联网 发布:冒泡排序java从小到大 编辑:程序博客网 时间:2024/06/01 08:23
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.testStaticOut[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. 库
- 常用标准库
- 常用扩展库
阅读全文
0 0
- python高级编程(六)--元类、内建属性
- python高级编程 ------元类(1)
- Python高级编程-----元类(2)
- Python高级编程--元类
- Python高级编程——9.元类
- Python学习 (六 面向对象高级编程)
- python元编程_获取类或对象的属性
- 多比矢量图开发手册(六)-Web高级图元编程
- Python元类编程
- PYTHON类自定义内建属性
- C++语言中的元类编程(六)
- Python高级主题:MetaClass 元类
- python基础学习(六):元组
- 【Python】学习笔记——-8.6、面向对象高级编程:6.使用元类
- c++模板元编程六:integral_constant 类
- 一个python程序员的ruby三日游(六)——重构(二)元编程
- 一个python程序员的ruby三日游(六)——重构(二)元编程
- python核心编程(六)— 序列:字符串、列表、元组
- 一些小知识点
- B树与B+树
- JAVA-枚举
- 2017/9/30 在线赛(A~E)
- 关系型数据库的原理
- python高级编程(六)--元类、内建属性
- java设计模式(三)——单例模式
- 数据结构与算法·实验六
- Isabella's Message (2011icpc成都站I题)hdu4119
- Angular Material主题
- 数据结构与算法·实验七
- pandas Dataframe行 列读取的方法
- 零散笔记
- python:NumPy基础(1),ndarray多维数组对象