Python入门 -5- 类(面向对象编程)

根据类来创建对象被称为实例化 这让你能够使用类的实例

  • 编写一些类并创建其实例
  • 指定可在实例中存储什么信息 定义可对这些实例执行哪些操作
  • 编写一些类来扩展既有类的功能 让相似的类能够高效地共享代码
  • 可以将自己的编写的类存储在模块中 并在自己的程序文件中导入其他程序员编写的类
创建和使用类
创建类
class Class_name():   //根据约定 子Python中 首字母大写的名称指的是类
	"""文档字符串 对类的功能作出描述:一次模拟小狗的简单尝试"""
	
	def __init__(self, name, age)
	""" 初始化属性name 和 age """
	self.name = name
	self.age = age
	
	def sit(self):
	""" 模拟小狗被命令时蹲下 """
	print(self.name.title() + " is now sitting.")
	
	def roll_over(self):
	""" 模拟小狗被命令时打滚 """
	print(self,name.title() + " rolled over!")
方法__init__ ()

类中的函数称为方法

方法__init__是一个特殊的方法 当你根据类创建新实例是 Python都会自动运行它 在这个方法的名称中 开头和末尾都各有两个下划线 这是一种约定 旨在避免Python默认方法与普通方法发生名称冲突

Python调用__init__ 方法创建实例时 将自动传入实参self 每个与类相关联的方法调用都自动传递实参self 它是一个指向实例本身的引用 让实例能够访问类中的属性和方法

以self为前缀的变量都可供类中的所有方法使用 我们还可以通过类的任何实例来访问这些变量

在Python 2.7 中创建类时 需要做细微的修改——在括号内包含单词object
class ClassName(object):
–snip- -

根据类创建实例

可以将类视为有关如何创建实例的说明
在这里 命名约定很有用:我们通常可以认为首字母大写的名称(如Dog)指的是类
而小写的名称(如my_dog)指的是根据类创建的实例

访问属性

要访问实例的属性 可使用句点表示法 :my_dog.name
每个实例都存储在不同的变量中 或占用列表或字典的不同位置

使用类和实例

类中的每个属性都必须有初始值

修改属性的值
  • 通过实例直接访问它 :使用句点表示法直接访问并设置属性
  • 通过方法修改属性的值 : 将值传递给一个方法 由它在内部进行更新
  • 通过方法对属性的值进行递增 禁止增量为负值 防止人为错误

注意:你可以使用类似上面的方法来控制用户修改属性值(如里程表读数)的方式 但能够访问程序的人都可以通过直接访问属性来讲里程表修改为任何值 要确保安全 除了进行类似其前面的基本检查外 还需特别注意细节

继承

如果要编写的类是另一个现成类的特殊版本 可使用继承
一个类继承另一个类时 它将自动获得另一个类所有的属性和方法 原有的类称为父类 而新类称为子类 子类继承了其父类的所有属性和方法 同时还可以定义自己的属性和方法

子类的方法 __ init __

创建子类时 父类必须包含在当前文件中 且位于子类前面
定义子类时 必须在括号内指定父类的名称
super()是一个特殊函数 帮助Python将父类和子类关联起来 父类也称为超类(superclass)

Python中函数super()需要两个实参:对象self和子类名 务必在定义父类时在括号内指定object

给子类定义属性和方法

使用句点表示法

重写父类的方法

在子类中定义一个方法 使它与要重写的父类方法重名
使用继承时 可让子类保留从父类哪里继承而来的精华 并剔除不需要的糟粕

将实例用作属性

使用代码模拟实物时 将类的一部分作为一个独立的类提取出来

模拟实物

从较高的逻辑层面(而不是语法层面)考虑 你考虑的不是Python 而是如何使用代码来表示实物 找出效率最高的表示法
只要代码像你希望的那样运行 就说明你做得很好 经过多次尝试不同的方法来重写类

导入类

Python 允许将类存储在模块中 然后在主程序中导入所需的模块

导入单个类
from module_name import Classname

创建一个只包含单个类的模块 将类存储在一个模块中 该模块将覆盖前面使用相同名称的文件 从现在开始 使用该模块的程序必须使用更具体的文件名
在模块中包含模块级文档字符串 对该模块的内容做简要地描述 应该为自己创建的每个模块都编写文档字符串
创建另一个文件 在其中导入类并创建实例
导入类是一种有效的编程方式
确定类像你希望的那样工作后 就可以不管这些文件了 更专注于主程序的高级逻辑了

在一个模块中存储多个类

将大部分逻辑都隐藏在一个模块中

从一个模块中导入多个类
from module_name import  Class_name_0,Class_name_1,Class_name_2
导入整个模块
import module_name

可以导入整个模块 再使用句点表示法访问需要的类 由于创建类实例的代码都包含模块名 因此不会与当前文件使用的任何名称发生冲突
使用语法module_name.Class_name 访问需要的类

导入模块中所有的类
from module_name import *

不推荐使用这种导入方式
需要从一个模块中导入很多类时 最好导入整个模块 并使用module_name.class_name语法来访问类 这样做时 虽然文件开头并没有列出用到的所有类 但你清楚的知道在程序的哪些地方使用了导入的模块 还避免了导入模块中的每个类可能引发的名称冲突

可以在一个模块中导入另一个模块
自定义工作流程

一开始应让代码结构尽可能的简单 先尽可能在一个文件中完成所有的工作 确定一切都能正确运行后 在将类移到独立的模块中 如果你喜欢模块和文件的交互方式 可在项目时就尝试将类存储到模块中 先编写能够可行代码的方式 再尝试让代码更为组织有序

Python 标准库

Python 标准库是一组模块 安装的Python都需要包含它
要创建字典并记录其中过得键-值对的添加顺序 可使用模块collections 中的OrderedDict类 在将信息关联起来的同时保留原来的顺序

类编码风格
  • 类名应采用驼峰命名法 类名中的每个单词的首字母都大写 而不适用下划线 实例名和模块名都采用小写形式 并在单词之间加上下划线
  • 每个类都应紧跟在类定义后面包含一个文档字符串 描述类的功能
  • 在类中 在使用一个空行来分隔方法 而在模块中 可使用两个空行来分隔类
  • 需要同时导入标准库中的模块和你编写的模块是 先编写导入标准库模块的import语句 在添加一个空行 然后编写导入你自己编写的模块的import语句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值