- 一 什么是面向对象编程
- 1. 面向过程的编程
- 2. 面向对象编程
- 3. 面向过程与面向对象的区别
- 二 python中的类和对象
- 1. 类
- 2. 对象(实例)
- 3. 对象和类的关系
- 三 类的定义
- 四 类的属性和方法
- 1. 属性
- 2. 属性的访问
- 3. 类属性和对象属性
- 4. 类方法
- 5. _ _init_ _ 和self
面向过程编程,即从业务的逻辑开头开始,从头到尾进行编程,或者说根据业务逻辑从上到下进行编程。
2. 面向对象编程面向对象编程是一种编程思维,是一个抽象的概念。是把具有相同属性,行为等特征的一类事或物归为一类。如生活中的人,人具有说话,行走,思考等特征;车有轮子,方向盘,能移动等特征。上面的人和车我们把他们分别进行分类,因为他们各自具有不同的特征,而某一个人和某一辆车则是一个对象,他们分别属于不同的类。
3. 面向过程与面向对象的区别- 面向过程和面向对象编程是两种不同的编程思维
- 面向过程重点在怎么做,注重做的步骤与过程,不注重职责分工
- 面向对象重点在谁来做,注重职责分工
- 当面向复杂的需求变化时,面向过程开发的代码没有固定的套路,开发难度大;而面向对象编程一般会有固定的编程套路或者模板,开发难度相对较小。
上面说过,类是一些具有相同的特征,行为的事或物的统称,是一个抽象的概念。在编程中,特征,行为对应如下
- 特征其实就是一个变量,在类中称为属性
- 行为其实就是一个函数,在类中称为方法
- 而类其实就是由属性和方法组成的一个抽象概念
对象是由类创建出来的一个具体存在,可以直接使用。由哪一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法。在开发中,应该先有类,在类里定义好属性和行为,再根据类来创建对象。
3. 对象和类的关系- 类是一个模板(统称),先有类,再有对象
- 使用同一个类,可以创建多个对象
- 类中定义了属性和方法,对象被创建后,具有类中相同的属性和方法
- 不同的对象具有类中相同的属性和方法,但是不同对象所对应的输出值不同
在python中,类的定义如下
class 类名: 属性1 属性2 ... 方法1 方法2 ...
例如创建一个Student,以及创建一个student1对象,student是类Student的一个对象,如下
#创建一个学生类
class Student:
"""打印学生的个人信息"""
#定义name和age属性值
name = "张三"
age = 23
#定义方法,打印个人信息
def persion(self):
print("学生信息:", self.name, self.age)
#创建一个对象
student1 = Student()
#student1调用方法(行为)persion,打印个人信息
student1.persion()
四 类的属性和方法
1. 属性
上面说过,类的特征其实就是类的属性,比如人有眼睛,手,脚等特征(属性);在编程中,属性就是一些变量,如下
#定义一个Persion类
class Persion:
"""一个简单的Persion类"""
name = "张三" #Persion的name属性
age = '24' #Persion的age属性
def persion_msg(self):
print("我是" + self.name + ", 年龄" + self.age)
#创建类对象,并赋值给p1
p1 = Persion()
p1.persion_msg()
这其中,name和age就是类Persion的属性。
2. 属性的访问类属性的访问有两种方式(句点法)
- 方式一:类.属性名
- 方式二:对象.属性名
#定义一个Persion类
class Persion:
"""一个简单的Persion类"""
name = "张三" #Persion的name属性
age = '24' #Persion的age属性
def persion_msg(self):
print("我是" + self.name + ", 年龄" + self.age)
#创建类对象,并赋值给p1
p1 = Persion()
#类.属性名 访问类属性
print(Persion.name)
print(Persion.age)
#对象.属性名 访问类属性
print()
3. 类属性和对象属性
类中的属性分为类属性和对象属性(方法中的变量)。各自的特征如下
类属性
1. 类属性定义在类的内部,任何方法之外
1.1 创建类的时候直接创建
2.2 类名.新的属性名=属性值
2. 使用类属性
2.1 对象.类属性
2.2 类.类属性
3. 类属性的特点
3.1 类属性是属于类对象的,所有类对象共有
3.2 对象共用类属性。如果类属性变化,所有的对象也会改变
4. 类属性有且只有一个
对象属性
1.对象属性定义在方法内部 2. 创建 2.1 对象.实例属性名=属性值 2.2 方法内部创建:self.属性名 = 属性值 3. 使用对象属性 对象.实例属性名 4. 对象属性各自拥有互相独立 5. 对象属性和类属性发生命名冲突 1. 以对象属性名优先 2. 对象属性名会覆盖该同名的类属性4. 类方法
其实类中的方法就是各种函数,它与普通函数的区别在于多了一个self参数,它的定义和调用如下
类方法的定义
def (self, 参数1, 参数2, ...)
def persion_msg(self):
print("我是" + self.name + ", 年龄" + self.age)
类方法的调用
#类方法的调用 方式一:类名().方法名() 方式二:对象.方法名()
#定义一个Persion类
class Persion:
"""一个简单的Persion类"""
name = "张三" #Persion的name属性
age = '24' #Persion的age属性
def persion_msg(self):
print("我是" + self.name + ", 年龄" + self.age)
#创建类对象,并赋值给p1
p1 = Persion()
#类方法调用
Persion().persion_msg()
p1.persion_msg()
5. _ init _ 和self
- _ init _ (): 该函数的作用是初始化对象(实例)。就是每当创建一个对象时,class类就会自动调用 _init _() 函数来初始化对象,并赋于一些初始值(如果有的话)。就如公司每新来一个员工,人事部门就会首先对他进行信息登记,然后给予工位工牌等,这其中人事登记就相当于初始化对象,而给予工位工牌就相当于赋于一些初始值。 如下
#定义一个Persion类
class Persion:
"""一个简单的Persion类"""
def __init__(self, name, age):
#__init__()初始化对象
self.name = name #Persion的name属性
self.age = age #Persion的age属性
def persion_msg(self):
print("我是" + self.name + ", 年龄" + self.age)
#创建类对象,并赋值给p1
p1 = Persion("张三", '24')
#类方法调用
p1.persion_msg()
其中,init()就是初始化对象,而self.name = name,self.age = age则是初始化对象的属性。该函数的特点如下
def __init__(): 1.这个方法不需要被调用,只要创建对象就会自动执行 2.这个方法只能返回None值,无法返回其他类型的值 3.如果要给init传递多个参数,只能通过 类名(多个参数) 的方式去传递 4.如果类里面没有定义init,默认去调用父类 5.如果类里面重复定义了多个init方法,会被最后一个init方法覆盖
- self:当对象被创建完后就赋值给了self参数,所以self参数就是对象本身。但self不是python的关键字,也可以用其他字符代替,不过一般默认用self,因为大家都用self!,如下
#定义一个Persion类
class Persion:
"""一个简单的Persion类"""
def __init__(self, name, age):
#__init__()初始化对象
self.name = name #Persion的name属性
self.age = age #Persion的age属性
def fun1(self):
print(self)
print(id(self))
def persion_msg(self):
print("我是" + self.name + ", 年龄" + self.age)
#创建类对象,并赋值给p1
p1 = Persion("张三", '24')
#类方法调用
p1.fun1()
print(type(p1))
print(id(p1))
从结果可以看出,对象p1的地址和初始化后的self的地址是一样的,所以,在类里self代表的就是对象本身。 self的特点如下
1. self在类里面代表的就是对象本身 2. self必须传递,且是默认传递,不需要我们去传递 3. self不是python的关键字,可以用其他字符替代 4. 哪个对象调用了方法,方法里的self指的就是谁 5. 通过 self.属性名 可以访问到这个对象的属性。 通过 self.方法名() 可以调用这个对象的方法。
参考文章:
https://blog.csdn.net/zhiguigu/article/details/120214801
https://blog.csdn.net/mall_lucy/article/details/106756318



