Python-9.3-OOP
OO
- 思想
- 以模块化思想解决工程问题
- 面向过程 vs 面向对象
- 由面向过程转向对象
- 常用名称
- oo:面向对象
- ooa:分析
- ood:设计
- oop:编程
- ooi:实现
- ooa -> ood -> ooi
- 类 vs 对象
- 类:抽象,描述的是一个集合,侧重于共性
- 对象:具象,描述的是个体
一:类
1、类的内容
- 动作:函数
- 属性:变量
2、定义类:class关键字
- 遵循大驼峰
- 第一个字母大写
3、self
- self可以用别的名称代替
- self不是关键字
- 作用是指代本身
4、类的变量作用域的问题
-
类变量
- 属于类自己的变量
- 注意类的变量的定义位置和方法
- 不需要前缀
-
实例变量
- 属于实例的变量
-
访问实例的属性,如果实例没有定义属性,则自动访问类的属性,如果类也没有定义,报错
# 定义类
class Student():
"""学生"""
def __init__(self, student, age):
"""初始化学生信息"""
self.student = student
self.age = age
def greet_student(self):
"""向学生问候"""
print(self.student.title() + " is " + str(self.age) + " years old.")
return None
# 定义对象
jack = Student('jack', 8)
jack.greet_student()
Jack is 8 years old.
5、访问类的属性
- 在类里面如果强制访问类的属性,则使用方法__class__(),注意前后两个下划线
- 类方法
- 定义类的方法的时候,没有self参数
- 类的方法只允许使用类的内容
- 访问类的内容
- ClassName
- 方法__class__()
# 定义类
class Student():
"""学生"""
"""初始化学生信息"""
student = 'jack'
age = 18
def greet_student():
"""向学生问候"""
# 类方法中不允许访问实例的任何内容
# 如果访问类的内容,注意两种用法
print("{} is {} years old.".format(Student.student, __class__.age))
return None
# 定义对象
Student.greet_student()
6、构造函数
- 类在实例化的时候,执行一些基础性的初始化的工作
- 使用特殊的名称和写法
- 自动调用
- 构造函数的调用时间
- 是在实例化的时候第一个被执行的函数
- 要求:
- 第一个参数必须有,一般推荐self
- 可以有 return
class Student():
"""学生"""
def __init__(self):
print("被调用")
return None
jc = Student()
被调用
二:面向对象的三大特征
- 继承
- 封装
- 多态
1、继承
- 子类可以使用父类定义的内容或者行为等
(1)继承的实现
- 父类、基类、超类:被继承的类 Base Class, Super Class
- 子类:有继承行为的类
- 所有类都必须有一个父类
- 如果没有,则默认是 object 的子类
- 子类有多个父类
# 所有类必须有父类
# 默认是 object
class Person(object):
"""一个人的简介"""
def __init__(self, name, age):
"""初始化人的属性"""
self.name = name
self.age = age
def describe_person(self):
"""描述一个人"""
print("My name is {} and I am {} years old.".format(self.name.title(), str(self.age)))
class Superman():
"""超人"""
def fly(self):
print("I can fly.")
# 父类写在类定义的时候括号里
# Python允许多继承
class Teacher(Person, Superman):
"""超人老师"""
def __init__(self, name, age):
super().__init__(name, age)
jack = Teacher('jack', 18)
jack.fly()
jack.describe_person()
I can fly.
My name is Jack and I am 18 years old.
(2) issubclass() 检测是否是子类
- 可以用来检测两个类的父子关系
# 利用issubclass()检测 Person(), Superman(), Teacher()之间的父子关系
print(issubclass(Person, Superman))
print(issubclass(Teacher, Person))
print(issubclass(Teacher, Superman))
False
True
True
(3)构造函数的继承
- 构造函数默认继承
- 子类如果没有构造函数,则自动调用父类的构造函数
- 一旦子类定义了,则不再自动调用父类构造函数
class Student():
"""学生"""
def __init__(self):
print("被调用")
return None
jc = Student()