面向对象的程序设计分为两种,一种是基于类的,另一种是基于原型的。其中基于类的程序设计是最常见的一种,它主要涉及到两个概念,即类和对象。类是一个抽象的概念,它描述了一类具有相同属性和方法的对象,而对象则是具体的实例。在基于类的程序设计中,类用于描述对象的属性和方法,而对象则是类的具体实现。因此,基于类的程序设计更注重对象的封装、继承和多态等概念
类
什么是类?
类:是对象的抽象,定义了一组大体相似的对象结构,定义了数据(属性)和行为(方法)。
类包括实体类(用于对必须存储的信息和相关行为建模的类,是需要长久保存且一直存在的类)、边界类(系统内部与系统外部的业务主角之间进行交互建模的类)、控制类(用于对一个或几个用例所特有的控制行为进行建模,在用例执行过程中被动出现的特定行为的类)。在领域类模型中会涉及描述类自身情况的属性与操作,还会有描述类与类之间的关联,但不会有对象层次的内容。
类实质上就是封装对象属性和行为的载体,而对象是类中具体的一个实例。
在Python中如何定义一个类?
class定义一个类名,类名下设置方法,设置方法的格式与定义函数的格式相同,主要区别在于方法必须显式地声明一个self参数,而且位于参数列表的开头。self表示类的实例(对象)本身,可以用来引用对象的属性和方法
根据类创建对象的语法格式如下:
使用对象的本质是访问对象成员:
在类的代码中我们可以定义变量和函数
-变量会成为该类实例的公共属性,所有的该类实例都可以通过 对象名.属性名 的形式访问
-函数会成为该类实例的公共方法,所有的该类实例都可以通过 对象名.方法名 的形式调用方法
其中 方法调用时,第一个参数由解释器自动传递,所以定义方法时,至少要定义一个形参,第一个参数就是解释器调用的方法本身
类中定义的属性和方法都是公共的,任何该类的实例属性都可以访问
属性和方法
属性按声明方式可以分为两种:类属性和实例属性
- 实例属性一般是指在构造函数_init_()或类的方法中定义的,定义和使用时必须以self为前缀,只能通过对象访问。Python支持动态添加实例属性。
- 类属性属于类,是在类中所有方法之外定义的数据成员,可以通过类名或对象名访问,但只能通过类进行修改
类体中、所有函数之外:此范围定义的变量,称为类属性或类变量;
类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;
类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。
访问实例属性——只能通过对象访问
修改实例属性——通过对象修改
动态添加实例属性——类外部使用对象动态添加实例属性
类属性声明在类内部、方法外部的属性,可以通过类或对象进行访问,但只能通过类进行修改
Python通过在类成员的名称前面添加双下划线(_)的方式来表示私有成员,语法格式如下:
- __属性名
- __方法名
私有成员在类的内部可以直接访问,一般在类的外部不能直接访问,但可以通过调用类的公有成员方法的方式进行访问,还可以通过特殊方法调用,语法:对象名.__类名+私有成员(此方法用于测试和调试,一般不建议使用)
类是客观事物的抽象,对象是类的实例化。Python使用class关键字定义类。
我们在类中所有方法之外定义的变量称为类属性,或者称作静态属性。类属性既可以用类名称访问,也可以用 对象名称访问 。使用格式为:“对象名称 . 变量名称”; “类名称 . 变量名称”
class Animal:
name = '团团'
type = '熊猫'
def food(self):
print('竹子')
guobao = Animal()
print('我的名字是',guobao.name)
print('我是一只',Animal.type)
输出结果:
我的名字是 团团
我是一只 熊猫
在上述示例中,我们通过对象名称guobao访问name得到变量 团团,通过类名称Animal访问type得到变量熊猫
class 类名:
类的内部实现
class关键字后紧跟空格,空格之后是类的名称。类名称之后必须有冒号,然后换行,通过缩进控制逻辑关系;最后定义类的内部实现。
根据编程规范,类名一般首字母大写
对象属性一般是指在 __init__ 构造方法中声明的属性,只能通过对象名称访问。
class Animal:
name = '轩轩'
type = '熊猫'
def __init__(self, age):
self.age = age
def food(self):
print('竹子')
guobao = Animal(2)
print('我的名字是',guobao.name)
print('我是一只',Animal.type)
print('我的年龄是',guobao.age,'岁')
类的基本结构
#类的基本结构
class 类名([父类])
属性名 = 属性值 #公共属性
#对象的初始化方法
def __init__(self,...):
pass
#其他方法
def 方法名(self,...):
pass
def 方法名(self,...):
pass
封装
封装是面向对象程序设计的核心思想,将对象的属性和方法封装起来
私有属性和私有方法都属于Python封装的形式,通过在属性和方法前加上两个下划线的方式,
限制类外对类内属性和方法的访问和修改。
私有属性和私有方法不能直接访问,否则就会报错。通过加上类名的形式进行访问能够成功访问,但是不建议使用
在 Python 面向对象中,类是由属性与方法组成的。其中,属性是对数据的封装,相当于一个对象所的静态 特征,属于类或者或者属于对象而有不同的定义与使用方法,类属性是在类中方法之外但又在类之中定义的属性,对象 属性是在构造函数中定义的属性。属性除分为类属性和对象属性外,还分为公有或私有,其通过标识符来区分。私有属 性不可以在类和实例的外部调用,若想强制访问私有属性及方法,可在私有属性及方法名前加 _ 类名
方法1:将对象的属性名,修改为一个外界不知道的名称
继承
继承是面向对象三大特征之一
通过继承我们可以使一个类获取其他类的属性和方法
在定义类时,可以在类名后的括号中指定当前类的父类(超类、基类、super)
子类(衍生类)可以直接继承父类中的所有属性和方法,避免编写重复性的代码
因此我们经常通过继承来对一个类进行拓展
在创建类时,如果省略了父类,则默认父类为object
object是所有类的父类,所有类都继承自object
isinstance用来检查一个对象是否是一个类的实例
如果这个类是这个对象的父类 同样也会返回true
所有对象都是object的一个实例