Python OOP面向对象编程

2023-07-30,,

OOP

思想:

以模块思想解决工程问题
面向过程 VS 面向对象
由面向过程转向面向对象
例子,我要开一个学校,叫XXX
讲师
学生
班主任
教室
学校

常用名词

OO:面向对象
OOA: 分析
OOD:设计
OOP:编程
OOI:实现
OOA -> OOD ->OOI

类 VS 对象

类:抽象,描述的是一个集合,侧重于共性
对象:具象,描述的是个体

类的内容:

动作,函数
属性,变量

is-a

定义类:class关键字

类命名:

遵循大驼峰
第一个字母大写

## 定义学生类,和几个学生

class Student():
# 此处定义一个空类
# passs是关键字,表示占位用的,无意义
pass
class StudnetNoPass():
pass
# 定义一个对象
xxxxxbai = Student()
#
class PythonStudent():
name = "yegeli"
age = 18
course = "Python"
'''
定义类中的函数
一般需要有self关键字
其余跟普通函数基本相同
'''
def giveMeMOney(self):
print("Show me the money")
return None xiaobai = PythonStudent()
print(xiaobai.name)
print(xiaobai.age)
print(xiaobai.course)
yegeli
18
Python

类的属性

# 类的例子
# 注意类的定义
class Student():
# name,age是类的变量
# 注意类的变量的定义位置和方法
# 不需要前缀
name = "野哥李"
age =19 # 类的实例方法
def sayHi(self):
print("类,动作")
return None # self可以更换名字
def sayHai(meme):
print("爱咪咪")
# 实例化
# 中文能当做变量名称
野哥 = Student()
print(野哥)
print(野哥.name)
<__main__.Student object at 0x0199ADB0>
野哥李

self

self可以用别的名称代替
self不是关键字
作用是指代本身

# self举例
# 实例调用函数
yaoyao = Student()
# 让yaoyao跟我打声招呼
# 因为默认实例作为第一个参数传入
yaoyao.sayHi() # 错误的案例
a = "三钠"
yaoyao.sayHi(a)
类,动作

---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-36-a7e3277fa362> in <module>()
8 # 错误的案例
9 a = "三钠"
---> 10 yaoyao.sayHi(a) TypeError: sayHi() takes 1 positional argument but 2 were given
# 参看sayHai的定义,说明self的名称可更改
yaoyao.sayHai()
爱咪咪

类的变量作用域的问题

类变量:属于类自己的变量
实例变量:属于实例的变量
访问实例的属性,如果实例没有定义属性,则自动访问类的属性,如果类也没有定义,报错

# 注意类的定义
class Student():
# name,age是类的变量
# 注意类的变量的定义位置和方法
# 不需要前缀
name = "野哥李"
age =19 def sayHi(self):
print("My name is {}, i am {} years old".format(self.name,self.age))
return None # 以下案例说明,实例变量可以借用类的变量
erjing = Student()
erjing.sayHi()
My name is 野哥李, i am 19 years old
# 注意类的定义
class Student2():
# name,age是类的变量
# 注意类的变量的定义位置和方法
# 不需要前缀
name = "野哥李"
age =19 def sayHi(self, n, a):
self.name = n
self.age = a
print("My name is {}, i am {} years old".format(self.name,self.age))
return None # 以下案例说明,实例变量可以借用类的变量
erjing = Student2()
# 注意观察下面语句打开和关闭后的区别
erjing.sayHi("erjing", 17)
print("My name is {}, i am {} years old".format(Student2.name,Student2.age))
print("My name is {}, i am {} years old".format(erjing.name,erjing.age))
# 如果访问实例的属性没有定义,则自动访问类的属性
# 如果类也没有定义,报错
print(ering.father)
My name is erjing, i am 17 years old
My name is 野哥李, i am 19 years old
My name is erjing, i am 17 years old --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-1-d8fc2922a91b> in <module>()
21 # 如果访问实例的属性没有定义,则自动访问类的属性
22 # 如果类也没有定义,报错
---> 23 print(ering.father) NameError: name 'ering' is not defined

访问类的属性

在类里面如果强制访问类的属性,则需要使用 class ,(注意前后两个下划线)
类方法:

定义类的方法的时候,没有self参数

类的方法中只允许用类的内容

两种用法

ClassName :类名
__class__:两个下划线class两个下划线
class Student():
# name,age是类的变量
# 注意类的变量的定义位置和方法
# 不需要前缀
name = "野哥李"
age =19 # sayHi是实例传参的方法,它有默认的传参self,把实例传进来
def sayHi(self): print("My name is {}, i am {} years old".format(self.name,self.age))
return None
# sos是类的方法,它不把实例传进来
# 调用需要用到特殊的方法
def sos():
# 方法中不允许访问实例的任何内容
# 如果访问类的内容,注意两种方法,类名及两个下划线class两个下划线
print("My name is {}, i am {} years old".format(Student.name,__class__.age))
return None
# 体验类的方法
s = Student()
s.sayHi()
# 调用类方法的例子
# 直接用类的名称调用
Student.sos()
# 类的方法与实例传参的方法对比:
s.sos()
My name is 野哥李, i am 19 years old
My name is 野哥李, i am 19 years old --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-33-0b52ebf4caa5> in <module>()
6 Student.sos()
7
----> 8 s.sos() TypeError: sos() takes 0 positional arguments but 1 was given

构造函数

类在实例化的时候,执行一些基础性的初始化工作
使用特殊的名称和写法
在实例化的时候自动执行
是在实例化的时候第一个被执行的函数

 # 注意类的定义
class Student():
name = "NoName"
age = 0 # 构造函数名称固定,写法相对固定
def __init__(self):
print("我是构造函数") erjing = Student()
print("-------------")
print(erjing.name)
print(erjing.age)
我是构造函数
-------------
NoName
0

Python OOP面向对象编程的相关教程结束。

《Python OOP面向对象编程.doc》

下载本文的Word格式文档,以方便收藏与打印。