Python 学习笔记-面向对象编程
2015-09-01 20:06
561 查看
Python类
Python有两种风格的类:新式类与旧式类(经典类)。主要区别是新式类必须继承至少一个父类。object是“所有类之母”。类属性
Python不支持虚拟函数(C++)或者抽象方法(Java),但是可以在基类方法中引发NotImplementationError异常实现类似的效果,强制他人在子类定义此方法。实例
_ _init__ ()
与_ _new_ _()
区别
__init__()与
__new()__()都可称为Python中的“构造器”方法,其中
__new()__()更像一个真正的构造器。
__init__()方法是创建一个实例后调用的第一个方法,本质上就是一个普通的方法,特殊在实例被创建后会被马上调用。这时候你可以设置实例属性,这样所有的实例都会拥有这些属性。
__new__()是一个静态方法,必须返回一个合法的实例,而这个实例可以返回给
__init__()使用。
__init__()应当返回None,否则会触发异常
实例属性
Python中可以动态设置实例属性,即设置属性可以在实例创建好后的任意时间进行,也可以在能够访问实例的代码中进行。推荐在__init__()构造器中设置常用实例属性。
实例属性vs类属性
类与相应的实例都可以访问类属性更新类属性只能通过类来操作
下面是一些测试实例:
>>> class Foo(object): ... ver = 1.3 ... >>> foo = Foo() >>> foo.ver 1.3 >>> Foo.ver 1.3 >>> foo.ver = 1.5 ##尝试更新类属性 >>> foo.ver ##貌似已经成功修改 1.5 >>> Foo.ver ##事实上类属性没变化,只是新建一个实例属性而已 1.3 >>> >>> del foo.ver ##删除实例属性 >>> foo.ver ##又可以访问类属性了 1.3 >>> >>> >>> foo.ver += .5 ##尝试其他修改方式,比如加法 >>> foo.ver 1.8 >>> Foo.ver ##没有任何卵用 1.3 >>>
可以通过上面的例子看出,通过实例修改类属性,事实上会创建一个与类属性同名的新实例属性,类属性毫发无损。因为新建了
ver实例属性,所以屏蔽了实例对类属性
ver的访问。
但是,假如类属性可变的情况下,一切又不一样咯。
>>> class Foo(object): ... dt = {11:"aa"} ##字典是可变对象 ... >>> foo = Foo() >>> foo.dt {11: 'aa'} >>> Foo.dt {11: 'aa'} >>> >>> foo.dt[22] = "bb" ##修改类属性dt >>> foo.dt {11: 'aa', 22: 'bb'} >>> Foo.dt ##成功修改 {11: 'aa', 22: 'bb'} >>> >>> del foo.dt Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Foo' object attribute 'dt' is read-only >>>
正如上面两个例子可以看出,通过实例修改类属性是非常危险的,不好控制。建议修改类属性只是用类名,而不是实例名
相关文章推荐
- python虚拟机virturalenv的使用
- python学习(1)--python处理文本
- Python 之 将 list 存储为 .mat 文件
- python unittest源码解析一----测试用例是如何被执行的
- python实现杨辉三角(使用生成器generator)
- python+Eclipse+pydev环境搭建(转)
- Python - Headless Selenium WebDriver Tests using PyVirtualDisplay
- Python 随手记
- 基础知识(七)opencv、python、人脸框检测
- python 遇到的异常
- python 基于dns 轮询的业务检测
- 每日python(5)
- Z-Score数据标准化处理(python代码)
- python基础练习笔记
- 避免python Popen阻塞
- python 切片(slice)
- 任意格式文件转成字符串,传输之后,还原为原文件格式
- python中strip() 函数和 split() 函数的理解
- Python之os.system()找不到路径的原因
- Opencv_Python学习笔记--OpenCV中的GUI特性