美文网首页程序员
Python 高级编程3

Python 高级编程3

作者: PythonMaO | 来源:发表于2017-06-08 20:52 被阅读117次

    1.1.1类也是对象

    在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:

    但是,Python中的类还远不止如此。类同样也是一种对象。是的,没错,就是对象。只要你使用关键字class,Python解释器在执行的时候就会创建一个对象。

    定义或创建一个类的时候,Python解释器将在内存中创建一个对象,对象名就是类名,这个对象(类对象)拥有创建对象(实例对象)的能力。但是,它的本质仍然是一个对象,然后你就可以对它进行一些操作

    1.你可以将它赋值给一个变量

    2.你可以拷贝它

    3.你可以为它增加属性

    4.你可以将它作为函数参数进行传递

    1.1.1动态地创建类

    因为类也是对象,你可以在运行时动态的创建它们,就像其他任何对象一样。首先,你可以在函数中创建类,使用class关键字即可。

    但这还不够动态,因为你仍然需要自己编写整个类的代码

    因为类的类型是type,就行字符串类型是str,整数是int。类也是type,可以使用type函数来创建类。

    使用type,可以实现动态的创建类,type可以接受一个类的描述作为参数,然后返回一个类。

    type(类名,由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

    我们使用"Test2"作为类名,并且也可以把它当做一个变量来作为类的引用。类和变量是不同的,这里没有任何理由把事情弄的复杂。即type函数中第1个实参,也可以叫做其他的名字,这个名字表示类的名字

    ·type的第2个参数,元组中是父类的名字,而不是字符串

    ·添加的属性是类属性,并不是实例属性

    1.1.1使用type创建带有方法的类

    最终你会希望为你的类增加方法。只需要定义一个有着恰当签名的函数并将其作为属性赋值就可以了。

    添加实例方法

    添加静态方法

    添加类方法

    在Python中,类也是对象,你可以动态的创建类。这就是当你使用关键字class时Python在幕后做的事情,而这就是通过元类来实现的。

    元类就是用来创建这些类(对象)的,元类就是类的类,

    函数type实际上是一个元类。type就是Python在背后用来创建所有类的元类

    type就是创建类对象的类。你可以通过检查__class__属性来看到这一点。Python中所有的东西,注意,我是指所有的东西——都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来,这个类就是type。

    1.1.1究竟为什么要使用元类?

    现在回到我们的大主题上来,究竟是为什么你会去使用这样一种容易出错且晦涩的特性?好吧,一般来说,你根本就用不上它:

    “元类就是深度的魔法,99%的用户应该根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。” —— Python界的领袖Tim Peters

    1.1垃圾回收

    小整数对象池

    Python对小整数的定义是[-5, 257)这些整数对象是提前建立好的,不会被垃圾回收。在一个Python的程序中,所有位于这个范围内的整数使用的都是同一个对象.

    1.1.1大整数对象池

    每一个大整数,均创建一个新的对象。

    1.1.1intern机制

    总结

    ·小整数[-5,257)共用对象,常驻内存

    ·单个字符共用对象,常驻内存

    ·单个单词,不可修改,默认开启intern机制,共用对象,引用计数为0,则销毁

    字符串(含有空格),不可修改,没开启intern机制,不共用对象,引用计数为0,销毁

    的都

    引用计数机制的优点:

    ·简单

    ·实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。

    引用计数机制的缺点:

    ·维护引用计数消耗资源

    循环引用

    list1 = []

    list2 = []

    list1.append(list2)

    list2.append(list1)

    list1与list2相互引用,如果不存在其他对象对它们的引用,list1与list2的引用计数也仍然为1,所占用的内存永远无法被回收,这将是致命的。 对于如今的强大硬件,缺点1尚可接受,但是循环引用导致内存泄露,注定python还将引入新的回收机制。(标记清除和分代收集)

    1.1.1.1垃圾回收机制

    Python中的垃圾回收是以引用计数为主,分代收集为辅

    1.1内建属性

    python3.5中类的内建属性和方法

    经典类(旧式类),早期如果没有要继承的父类,继承里空着不写的类

    py2中无继承父类,称之经典类,py3中已默认继承object

    子类没有实现__init__方法时,默认自动调用父类的。如定义__init__方法时,需自己手动调用父类的__init__方法

    相关文章

      网友评论

        本文标题:Python 高级编程3

        本文链接:https://www.haomeiwen.com/subject/dqbafxtx.html