第二章 Python对象

  • 在Python中如何创建类并实例化对象
  • 如何给Python对象添加属性和行为
  • 如何把类组织成包和模块
  • 如何建议别人不要错误使用我们的数据

创建Python类

    class MyFirstClass: # class全小写

        pass

    类的定义以关键字class 开头。之后跟着一个名字(用户定义)用来标识这个类,并且以冒号结尾。pass是关键词,表示不需要实际内容,但不会报错。而Python中对缩进有严格要求,对相同逻辑层需要保持相同的缩进。

那么何时需要缩进

    物理行与逻辑行

    物理行:编辑器中打开的代码,显示的每一行内容是一个物理行。
    逻辑行:Python解释器对代码进行解释,一个语句是一个逻辑行。

代码书写过程,可以使用";“将多个逻辑行写作一个物理行,可以使用”"将一个逻辑行写作多个物理行,所以一个物理不一定是一个逻辑行,而缩进是针对逻辑行的。

1、逻辑行的首行需要顶格,即0缩进

2、相同逻辑层保持相同的缩进

3、":" 标记一个新的逻辑层, 增加缩进进入下一个代码层,减少缩进返回上一个代码层。":"后面未换行,解释器视为一个逻辑行,那么下一行一定不能增加缩进

例化了类对象,要想实现交互,可以把类定义保存到 first_class.py的文件,然后运行命令python -i first_class.py。参数 -i 的作用告诉Python“运行这段代码然后抛向交互式解析器”。这样就可以运行文本代码并在终端里交互这个类。

添加属性

    在类的定义中,可以不必做任何操作。我们可以通过点记法给一个实例化的对象赋予任意属性:

通过点记法赋值时,这个值可以是任意的。(python内置数据类型、其他对象、函数或另一个类)

让类实际做一些事情

    class Point:

        def reset(self):

            self.x = 0

类中定义的函数称为方法,方法的定义必须要传入 self 这个参数,这个参数是对调用这个方法的对象的一个应用。所以p.reset()相当于reset(p)。

在类中定义方法必须传入self,以备利用对象调用。若没有传入self参数,虽然不会报错,但这就成了类中的函数只能在内部使用,不能被以对象的形式调用否则会报错。

对象的初始化

    __init__方法在上例中已经用到,当实例化对象时类就会自动调用的方法

解释自己

    python的docstring提供了描述代码内容的文档。在每一个类、函数、方法的开头,紧接着他们的定义(以冒号结尾那行)可以有一行python的标准字符串。这行字符串也需要和下面代码一样有缩进。若想跨行描述可以用(''' ''' 或 """ """)

什么是API(应用程序接口):可以理解为把功能定义好的一个函数,可以直接调用的一个功能接口。

    研发人员A开发了软件A,研发人员B正在研发软件B。
有一天,研发人员B想要调用软件A的部分功能来用,但是他又不想从头看一遍软件A的源码和功能实现过程,怎么办呢?
研发人员A想了一个好主意:我把软件A里你需要的功能打包好,写成一个函数;你按照我说的流程,把这个函数放在软件B里,就能直接用我的功能了!其中,API就是研发人员A说的那个函数。

python中docstring文档总结:

类的函数称为方法(method),模块里的函数称为函数(function)

  1. 每一个包,模块,类,函数,方法都应该包含文档,包括类的__init__方法
  2. 包的文档写在__init__.py文件中
  3. 文档有单行文档和多行文档
  4. 单行文档:
    1. 不要重复函数的声明语句,例如:function(a, b) -> list
    2. 指明做什么和返回什么,例如Do X and return a list.
    3. 使用三引号,方便换行
  5. 多行文档:
    1. 如果模块是一个脚本,也就是单文件程序,模块的文档应该写明脚本的使用方法
    2. 模块的文档需要写明包含的类,异常,函数
    3. 如果是包,在__init__.py中,写明包里面包含的模块,子包
    4. 如果是函数或类方法,应该写明函数或方法的作用,参数,返回,副作用,异常和调用的限制等
    5. 如果是类,写明类的行为,和实例参数,构造方法写在__init__中
    6. 使用三引号,而且两个三引号都应该单独成行

可以使用__doc__(注意双下划线)调用函数的文档字符串属性(属于函数的名称)。请记住Python把 每一样东西 都作为对象,包括这个函数。如果你已经在Python中使用过help(),那么你已经看到过DocStings的使用了!它所做的只是抓取函数的__doc__属性,然后整洁地展示给你。你可以对上面这个函数尝试一下——只是在你的程序中包括help(printMax)。记住按q退出help。自动化工具也可以以同样的方式从你的程序中提取文档。因此,我 强烈建议 你对你所写的任何正式函数编写文档字符串。随你的Python发行版附带的pydoc命令,与help()类似地使用DocStrings。

模块和包

    import 语句是用来导入模块或者从模块里导入特定的类或函数的。若有两个模块一个模块需要从另一个模块里例化一个类。

这样我们可以在这个模块里通过point_class.<something>访问point_class的任何对象。

对于 from  somemodul  import  *     的用法会导致在回溯类的来源时,很模糊。因此不推荐使用。

组织模块

   python中模块就是一个python文件而已。然而,文件可以放到文件夹里。一个包(package)就是放到一个文件夹里的模块集合。包的名字就是文件夹的名字。Python 中的包,即包含 __init__.py 文件的文件夹。

    python在运行程序时,会将top级模块作为真实的路径(且最高路径,即不能再通过 ..到它(top级模块)的上一级导入模块),并且这种效果是针对所有模块而言的,所以我们在设计代码框架时最好将top级模块放在工程最上层,以确保所有子模块都能在包间相互调用。

 

 

若没有设置top级在最外层,也想实现包间的调用呢?对于上层到下层的调用都是见到的直接一步步指向低层

就行了。而下层想导入上层,python是不能像windows命名窗口一样的直接通过  ' ../ ' 的切换到上一级的,这样是会报错的,因为前面已经介绍python会将top级视为最高级,不能再上了。所以最终要介绍python的搜索路径“

普通 Python 模块的搜索路径

1. 在当前模块所在路径中搜索导入模块

2. 在环境变量 PYTHONPATH 指定的路径列表中搜索导入模块

3. 在 sys.path 指定的路径列表中搜索导入模块

1.当前模块已经不能满足需求了;2.添加环境变量也太笨了,不可能每个工程都填一个环境变量;

3.在 sys.path 指定的路径列表中搜索导入模块,可以通过当前工程做实时的改动。

所以我们只要在我们的模块中利用 sys.path.append('一个路径') 语句为模块添加一个能找到我们要导入模块的路径就行了(建议添加一个对于所有模块都是上层的路径)

(括号中相对导入是其他博客看的介绍,但实际使用__init__.py,可有可无。相对导入时,package所对应的文件夹必须正确的被python解释器视作package,而不是普通文件夹。否则由于不被视作package,无法利用package之间的嵌套关系实现python中包的相对导入。

文件夹被python解释器视作package需要满足两个条件:

该文件夹中必须有__init__.py文件,它可以为空,但必须存在
该文件夹不能作为顶层模块来执行文件夹中的py文件 (即不能作为主函数的入口))

谁可以访问我的数据

    在python中没有真正的私有属性,若给一个属性或方法加一个下划线的前缀,表明这是一个内部变量,提示你不要直接访问这个变量,但实际还是可以直接访问。还有另一种方式,强烈建议外部对象不能访问某个属性或者方法,即在其前面加一个双下画线。这样会对属性或方法做“名称改编”,直接访问是访问不到的,需要做额外的操作,即“名称改编”在其前加一个_<classname>的前缀。如 :类 MyClass 的 私有变量  self.__plain   要在外部访问它需调  object._MyClass__plain  。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值