Python 学习笔记-面向对象编程

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 "", line 1, in 
AttributeError: 'Foo' object attribute 'dt' is read-only
>>> 

正如上面两个例子可以看出,通过实例修改类属性是非常危险的,不好控制。建议修改类属性只是用类名,而不是实例名

你可能感兴趣的:(Python学习)