您的位置:首页 > 编程语言 > Python开发

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
>>>


正如上面两个例子可以看出,通过实例修改类属性是非常危险的,不好控制。建议修改类属性只是用类名,而不是实例名
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: