类(OOP)
在面向对象编程,一个类是创造的蓝图吗对象(特定的数据结构),为状态(成员变量或属性)提供初始值,以及行为(成员函数或方法)的实现。
属性创建用户定义对象类
关键字。类是定义未来对象性质的蓝图。一个实例从特定类创建的特定对象。类用于创建和管理新对象和支持继承-面向对象编程的关键组成部分和重用代码的机制。
上图显示了如何车
对象可以是许多其他对象的模板车
实例。在图中,有三个例子:马球
,迷你
,甲虫
.在这里,我们将创建一个名为车
,这将构造一个车
对象,该对象包含有关汽车的型号、颜色、能容纳多少乘客、速度等信息。类可以定义可以在对象上执行的操作类型或方法车
对象。例如,车
类可以指定加速
方法,该方法将更新速度
car对象的属性。
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
类是一种组织关于一种数据类型的信息的方法,这样程序员就可以在创建该数据类型的多个实例时重用元素——例如,如果程序员想创建三个实例车
比如宝马、法拉利和福特。的车
类将允许程序员存储每辆车特有的类似信息(它们是不同的型号,可能是不同的颜色,等等),并将适当的信息与每辆车关联起来。
类
创建类
在Python中,类是由关键字声明的类
后跟类名。一个类
语句将一个新类定义为def
语句定义一个新函数。
下面的示例将定义一个定义Brilliant用户的简单类。
1 |
|
构造函数方法
在声明类名之后,程序员必须定义构造函数方法。在Python中,这是表示的__init__ ()
.的__init__
函数自我
作为第一个参数,然后是程序员想要的任意数量的参数。对于这个描述Brilliant用户的示例,程序员希望知道每个用户的姓名、年龄和评分。
这个名字__init__ ()
用于类的“构造函数方法”。虽然类是新数据类型的蓝图,但程序员仍然需要创建这种数据类型的值,以便拥有可以存储在变量中或传递给函数的内容。
调用时,构造函数创建新对象,在构造函数中运行代码,并返回新对象。这就是user = brilliantUser ('Mursalin', 17,4)行。无论类名是什么,构造函数总是被命名__init__
.
到目前为止,我们做到了
1 2 |
|
上面定义了方法用于brilliantUsers类。方法用于属于类的函数。
的变量和体__init__
方法
类中的参数,并将它们与类的特定实例相关联__init__
方法,像这样为每个参数创建变量:自我。variableName =变量名
.
与类相关联的另一个组件是属性.属性是对象的特征。这个方法叫做__init__ ()
用于初始化对象的属性。就像方法是类中定义的函数,属性是类中定义的变量。
类定义中的每个方法都以实例对象的引用开始。按照惯例,这被命名为“self”。
在Python中,方法的第一个参数是自我
.的自我
参数用于创建成员变量。在类内部,我们将根据类的特定实例将可能具有不同值的任何变量初始化为自我。VariableName
.对于汽车的例子,我们可能想要访问颜色
变量的car_1
和颜色
变量的car_2
为了给每辆车分配颜色
价值,我们需要的自我
.
Brilliant用户示例的构造函数体如下所示:
1 2 3 |
|
这段代码为构造函数创建的对象创建成员变量。成员变量将以自我
以显示它们是属于对象的成员变量,而不仅仅是方法中的常规局部变量。
所有这些放在一起,描述Brilliant用户的类是这样的:
1 2 3 4 5 6 7 8 9 10 |
|
创建实例
一个实例从特定类创建的特定对象。要创建类的实例,请使用类名调用类,并传入其参数__init__
方法accept—在本例中,为__init__
方法以的名字
,年龄
,评级
.
1 |
|
的新实例brilliantUser
类。换句话说,我们实例化brilliantUser
类。
变量
实例变量
一个实例变量与类的特定实例相关联的变量。例如,速度
可以是一个实例变量车
对象,并且可以有两个实例车
一辆红色的车和一辆蓝色的车,每辆车都有自己的速度。即使变量在不同实例中命名相同,但值是独立的,改变蓝色汽车的速度不会影响红色汽车的速度。
类变量
一个类变量引用作为类变量的属性。它们可以像任何其他变量一样使用,因为它们是在创建类时设置的,并且可以通过类内的方法或程序主体部分的其他地方进行更新。这些变量在类的所有实例之间共享,更改此变量将影响类的所有实例。
使用class data属性的例子:
1 2 3 4 5 6 7>>>类酒吧(对象):...喷火=2>>>打印酒吧.喷火2>>>酒吧.喷火=酒吧.喷火+1>>>打印酒吧.喷火3.
类是数据结构定义类型,而实例是该类型变量的声明。实例本质上是赋予生命的类。一个类
声明基本上描述了应该存在的框架。如果任何房屋的单个一般建筑计划是一个类,那么实例将是实际的特定类型的房屋,具有自己的属性,但仍然遵循一般结构。尽管许多其他OOP语言提供了一个新的关键字来创建实例类,但Python只需要使用参数调用类即可。
创建一个类的实例的例子:
1 2 3 4 5 6 7 8 9类房子(对象):def__init__(自我,大小,颜色):自我.颜色=颜色自我.大小=大小bluehouse=房子(4,“蓝色”)redhouse=房子(2,“红色”)打印bluehouse.颜色#打印“蓝”打印redhouse.颜色#打印“红色”
运行程序时会输出什么
1 2 |
|
使用下面的代码?
在实际运行代码之前,试着在头脑中遍历这个程序以找到答案。
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 |
|
运行程序时会输出什么
1 2 |
|
使用下面的代码?
在实际运行代码之前,试着在头脑中遍历这个程序以找到答案。
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 |
|
对象变量类型和范围
在面向对象编程中,方法和变量有各种不同的范围.作用域意味着其他对象或类可以也可以不直接访问该方法或变量。系统可以访问没有实例的类。
类作用域:类变量和类方法与类相关联。类(对象)的实例并不需要使用这些变量或方法。类方法不能访问实例变量或方法,只能访问类变量和方法。
实例范围:实例变量和实例方法与特定对象相关联。它们可以访问类变量和方法。
私人空间:私有变量和私有方法只能被它们所在的对象访问。因此,如果出现问题,通常只有一个源文件可以查看。如果你的项目中有一百万行代码,但是你的类保持的很小,这可以大大减少你的错误跟踪工作。
公共空间:公共变量和公共方法可以在它们所包含的对象之外访问,这对于实际的考虑意味着“可能在任何地方”。如果某个公共字段出了问题,那么罪魁祸首可能在任何地方,因此为了追踪错误,您可能必须查看大量代码
保护范围:受保护的变量和受保护的方法可以被它们所在的类和继承的类(子类)访问。
封装:提供一个公共接口与对象交互,同时将其他信息隐藏在对象内部的过程。封装意味着对象的内部表示通常隐藏在对象定义之外的视图中。封装帮助减少变更的涟漪效应的主要方法是保持尽可能多的实现细节为类私有。通过将接口限制为使用该类所需的成员,可以对实现进行许多更改,而不会影响使用该类的任何代码。
继承、超类和重写方法
继承基本上是指不同的类可以有相似的组件,为了避免重复代码,使用继承将父类链接到子类。例如,在一个奇幻故事中,有英雄和怪物,但英雄和怪物都是角色。龙和兽人都是怪物。虽然龙和兽人是不同的怪物,但他们有一些读者可能想知道的共同特征:他们都有颜色,他们都有大小,他们都有敌人。半兽人可能具有龙所没有的特征;例如,兽人携带什么样的武器?为了允许类在非常特定地进入后代对象之前共享一些关键信息,继承允许类共享与代码的多个部分相关的信息。
在Brilliant成员的例子中,Brilliant员工和用户共享一些相同的特征(姓名、年龄、级别)。然而,它们还定义了使它们不同的附加特性:for工作人员
我们可能想要增加薪水、专业领域等等。
面向对象编程允许类从其他类继承常用的状态和行为。在这个例子中,工作人员
是子类的brilliantUsers
,brilliantUsers
是一个超类的工作人员
.
1 2 3 4 5 |
|
这实际上是在说,“A工作人员
和a一样吗用户
,并添加了一些额外的方法和成员变量。
继承允许代码被重用,并降低程序的复杂性。派生类(后代)覆盖或扩展基类(祖先)的功能。
注意,继承可能被滥用。的任何更改或更新用户
类的可接受更新工作人员
类和其他子类用户
有。
继承描述父类的属性如何被子类继承。子类继承父类的属性和方法。
下面是一个例子。父
是一个没有属性的简单类。孩子
派生的类是父
And因此是一个子类。
1 2 3 4 5类父(对象):#父类通过类孩子(父):#子类通过
让我们在里面创建一个方法父
将在它的子类中重写:
1 2 3 4 5 6 |
|
现在让我们创建子类:
1 2 3 4 5 6 |
|
重写方法
虽然孩子
继承了父
的有趣的
方法,它是覆盖因为孩子
定义自己的有趣的
方法。重写方法的一个原因是为子类添加特殊的惟一功能。
如果你想调用你在子类中覆盖的父类方法,调用一个未绑定的父类方法,显式地提供子类的实例:
1 2 |
|
模块
为了避免单调、重复的工作,经常需要使用模块/库/包(取决于语言,它们有不同的名称)。模块是一个不同的东西,它可能包含许多密切相关的类。诀窍在于,模块是程序员导入到代码中的东西,并且导入需要对将要阅读、维护和扩展软件的人完全敏感。
在Python中,模块是使用进口
声明。
1 |
|
在Python中,每个以.py结尾的文件都是一个模块。
1 2 3 4 5 6 7 8 9 10 11 |
|
将此文件另存为basic.py
:
1 2 3 4 5 6 7 8 9 10 11 |
|
将此文件另存为more.py
:
1 2 3 4 5 6 7 8 9 10 |
|
它会输出
1 2 3 4 5 6 |
|
在上面的例子中,模块basic.py
而且more.py
每个只包含一个类,但不需要这样。将导入看作是将代码组织成概念或块的方法。每个导入中究竟有多少类并不重要。重要的是用import语句描述的整体组织。
请注意basic.py
而且more.py
都在进口print_function
来自python的内置__future__
模块。这允许我们在python 2和python 3上运行相同的代码。它还演示了利用模块功能的另一种方式。
另请参阅
参考文献
- , P。cpt - oop对象和类.检索2016年6月13日,从https://en.wikibooks.org/wiki/File:CPT-OOP-objects_and_classes.svg
- , P。继承扮演游戏.检索2016年6月13日,从https://en.wikibooks.org/wiki/File:CPT-OOP-inheritance-roleplay.svg