Python OOP面向对象编程
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