Python的面向对象

本文深入介绍了Python的面向对象编程,包括类和实例的概念、封装和抽象、新型和经典对象模型的区别。详细讨论了类的定义、类属性、方法以及实例的创建、初始化和解构。同时,文章强调了类属性的不变性以及访问类属性和方法的规则。
摘要由CSDN通过智能技术生成

  和其他的面向对象语言类似,Python也能使用面向对象机制,但Python的面向对象和其他语言的有所不同。首先,我们先来了解一下python的类和实例。

一:类和实例

  我们知道面向对象与面向过程是有很大区别的,面向对象是将计算机的程序作为一组对象,计算机的执行实际上就是对象在互相之间进行传递消息的过程,python的面向对象将所有的事物作为对象(即一切都是对象!!)。

1.1封装和抽象:

  Python将事物的一些特性抽象成属性和同一个事物的相关行为抽象成方法/函数,然后将两者组合(封装)在一起,形成一个对象(类对象)!这还没完,类对象接着进行具象化,变成一个个有具体含义的实例。--类对象是实例的上一层抽象。

  ok,我们明白了什么是类和实例之后,我们先来看看新对象模型和经典对象模型(这有助于我们理解之后的一些问题)。

1.2新型对象模型和经典对象模型:

    对于python中的类,分为经典类和新式类(经典类在2.7版本之前兼容,而在3之后的版本就只能使用新式类)。

    区别经典类和新式类:

      1、经典类默认没有派生自某个基类,只有显式继承了Object才会是新式类;而新式类默认派生自Object类

      2、经典类在类的多重继承时,采用从左到右深度优先算法;而新式类采用C3算法

     3、经典类是没有__MRO__和instance.mro()调用的,而新式类是有的

     4、新型类有__slots__属性和__getattribute__()方法,有修饰器;而经典类没有

     5、新式类相同父类只执行一次构造函数,经典类会重复执行多次

     6、经典类中的实例调用__class__定义了实例的类名,type()方法返回<type "instance">;而新型类中的实例调用__class__和type()方法都会返回实例的类名(新式类中内置类型和自定义类是相同的)

   经典对象模型是在python的2.7版本之前使用的,而在3之后的版本就只使用新型对象模型了!ok,在我们了解了两种对象模型的区别之后,就可以继续学习之后的知识了。

1.3类:

1.3.1类的定义:

  类是对数据(属性)和行为(方法)进行抽象并进行封装的集合,类会对外提供接口("."进行属性引用)以供类之外的对象进行调用。

  我们先来看一个例子来具体看看到底类是怎样定义的,以及类中的方法和数据属性是怎样的。

>>> class A():
...    def __init__(self,name):
...        self.name=name
...    ff=7
...
>>> A
<class '__main__.A'>

  我们现在知道了类是由属性和方法构成的,为了对类进行进一步的分析,我会在下面一步步的对类的属性和方法分别详细介绍。

1.3.2类属性:

  在了解类属性之前,我们需要先明白什么是属性!那么什么是属性呢?属性就是某个对象的数据元素。而类属性就是绑定在其被定义的类上的这些属性。(类属性不依赖于实例)

注意:属性也是对象,属性(对象)也会有自己的属性(数据元素和函数),即属性与属性之间形成了一个属性链。

类属性的三种表示形式:

  1、一般属性(不以"__"开头)

  2、以"__"开头但不以"__"结尾的属性

        无法使用以""__""开头但不以"__"结尾的属性名

  3、特殊属性(以"__"开头且以"__"结尾):

       __class__      类对象(作为实例)所对应的类


      __doc__       文档字符串,用于描述该类的各种信息


  __bases__     该类的父类构成的元组


  __dict__        该类的属性构成的字典(键为属性名,值为属性的值)


  __module__   该类所定义在的模块


  __name__       该类的名字

  接下来,同样举一个例子来看看类的数据属性是怎样的。首先我们定义了三个不同的数据属性:name、__sum、__sam__,然后我们使用了dir()方法,该方法会将对象的属性以列表的形式表示出来!从该列表中我们可以看见name和__sam__,但是为什么没有__sum呢?

  嘿嘿,虽然没有名为__sum的属性,但是有名为_A__sum的属性,这个属性和__sum很类似。我们先看看调用三个属性能否得到结果,就能明白_A__sum的含义了!

>>> class A():
...    name=1
...    __sum=2
...    __sam__=3
...
>>> dir(A)
['_A__sum', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq_
_', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__'
, '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '_
_reduce__', '__reduce_ex__', '__repr__', '__sam__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'name']

  下面是调用三个属性的结果,我们发现在调用__sam__和name时并没有什么问题,但是在调用_

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值