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__方法
网友评论