记述python中关于面向对象程序设计的使用。
一、面向对象概述
面向对象(Object Oriented),简称OO;
面向对象编程(Object Oriented Programming),简称OOP。
1.对象
英文为Object,表示任意示食物,与显示世界的实际事物一一对应。
对象包括:静态的属性和动态的行为。
2.类
对对象的封装。
3.面向对象程序设计的特点
- 封装:将对象的属性 和行为封装起来
- 继承:通过继承获取已封装对象,实现重复利用
- 多态:子类继承父类同时实现自己的属性和方法,实现不同的效果
二、类的定义和使用
1.定义类
class ClassName:
"""类的注释"""
statement
- ClassName:类的名称
- """类的注释""":类的注释性字符串,定义后,声明类的时候会显示该信息,输入类命和”(“后提示。
- statement:类体,类的属性、方法等,若没有,可使用pass占位
2.类的实例化
ClassName(parameterlist)
- ClassName:类的名称
- parameterlist:可选参数,创建类时未声明__init__()方法或者该方法只有一个self参数时可省略。
3.创建__init__()方法
类似于C#中的构造方法,创建实例时自动运行,用来声明类的参数信息。
# 定义类
class ClassNmae:
"""ClassName"""
def __init__(self):
statement
- __init__(self)声明方法时至少包含一个参数self,类似于C#中的this,表示自身
- __init__()只有一个参数时,声明类的时候可以省略参数。
4.创建类的成员和访问
4.1 创建实例方法并访问
def functionName(self,parameterlist):
block
- functionName:方法名称
- self:类的实例方法,定义时第一个参数必须为self
- parameterlist:类的参数
- block:类的具体代码段,实现类的功能
可以通过类的实例名称和"."进行访问:
instanceName.functionName(parametersvalue)
- instanceName:实例化的类
- functionName:类的方法名
- prametersvalue:具体参数
4.2 创建属性成员并访问
4.2.1 类属性
在类中定义的属性,可以在所有实例化对象中使用,类的所有实例之间共享值,类似于C#中的静态属性。
# _*_ coding:utf-8 _*_
# 定义类
class ClassNmae:
"""ClassName"""
parameter1 = value1
parameter2 = value2
def __init__(self):
statement
- 类属性声明时需要赋值
- 类属性为所有实例共用,数值修改
- 通过实例+属性名称或类名+属性名称方式访问属性
- 使用"ClassName.parameterName"的格式可以动态添加类属、修改类属性
示例:
# _*_ coding:utf-8 _*_
# 定义类
class Work:
"""Work class"""
name = "Student"
remuneration = 10000
num = 1
def __init__(self):
print("My sn:",Work.num)
print("I'm work:",Work.name)
print("Remuneration:",Work.remuneration)
Work.num += 1
work1 = Work()
work2 = Work()
Work.year = 2022
work3 = Work()
print(work1.year)
print(work2.year)
print(work3.year)
结果:
========================== RESTART: D:\Desktop\Demo.py =========================
My sn: 1
I'm work: Student
Remuneration: 10000
My sn: 2
I'm work: Student
Remuneration: 10000
My sn: 3
I'm work: Student
Remuneration: 10000
2022
2022
2022
>>>
注意:
调用类属性时需要以"类命.属性名"的形式调用,否则会报错NameError。
4.2.2 实例属性
只定义在类方法中的属性,只作用于当前实例。
# _*_ coding:utf-8 _*_
# 定义类
class ClassNmae:
"""ClassName"""
def __init__(self):
parameter1 = value1
parameter2 = value2
statement
- 实例属性修改后不会影响其他实例的数据
- 实例属性只能通过实例名+属性名进行i访问,实例属性通过类命进行访问会报错
- 方法内部通过self+属性名进行实例属性访问
示例:
# _*_ coding:utf-8 _*_
# 定义类
class Work:
"""Work class"""
def __init__(self):
self.name = "Student"
self.remuneration = 10000
self.num = 1
print("My sn:",self.num)
print("I'm work:",self.name)
print("Remuneration:",self.remuneration)
self.num += 1
work1 = Work()
work2 = Work()
work1.name = "Student1"
work1.name = "Student2"
print(work1.name)
print(work1.name)
结果:
My sn: 1
I'm work: Student
Remuneration: 10000
My sn: 1
I'm work: Student
Remuneration: 10000
Student2
Student2
5.访问限制
python通过在方法和属性添加下划线来进行访问权限限制
标识 | 说明 | 备注 |
---|---|---|
首尾双下划线 | 定义特殊方法,一般是系统定义名字 | 如:__init__() |
单下划线开头 | protected(保护)类型 只允许本身和子类进行访问,不能使用”from module import *”导入,可以使用实例进行访问 | 如:_name = "a" |
双下划线开头 | private(私有)类型; 只允许定义该方法的类本身访问,而且也不能通过类的实例访问。 可以通过“类的实例名._类名__xxx”进行访问 |
示例:
# _*_ coding:utf-8 _*_
# 定义类
class Work:
"""Work class"""
_name = "work"
__remuneration = 10000
def __init__(self):
print("I'm work:",Work._name)
print("Remuneration:",Work.__remuneration)
work1 = Work()
work2 = Work()
print("Work._name:",Work._name) # 访问保护变量
print("work1._name:",work1._name)
print("work2._name:",work2._name)
print("Work.__remuneration:",work1._Work__remuneration) # “实例名._类命__xxx”访问私有变量
print("Work.__remuneration:",Work.__remuneration) # 直接访问私有变量会报错
结果:
I'm work: work
Remuneration: 10000
I'm work: work
Remuneration: 10000
Work._name: work
work1._name: work
work2._name: work
Work.__remuneration: 10000
Traceback (most recent call last):
File "D:\Desktop\Demo.py", line 20, in <module>
print("Work.__remuneration:",Work.__remuneration)
AttributeError: type object 'Work' has no attribute '__remuneration'
>>>
三、属性(property)
1.用于计算的属性
通过@property装饰器将一个方法转换为属性,转换为属性后可直接通过方法名访问方法,不在需要添加“()”,类似于C#中用{get;set;}访问器访问属性。
格式如下:
@property
def methodName(self):
block
- 通过@property转换后的属性不能进行赋值,否则会报错AttributeError
2.为属性添加保护机制
- 使用@property装饰器可以将方法转换为只读属性
- 通过"@属性.setter"为属性设置拦截器来修改属性