面向对象
程序开发的两种思想:
- 两种开发思想各有长短。
- 面向过程(pop):以程序执行过程为设计流程的编程思想
- 面向过程出现得较早,典型代表为C语言,开发中小型项目的效率很高,但是很难适用于如今主流的大中型项目开发场景。
- 面向过程:程序员面向的是一个功能函数,关心函数的具体实现过程和实现步骤,面向过程开发其实就是面向函数开发。
- 面向过程: 程序员 -> 功能函数
俗一点说:从函数功能到动作 吃(狗,翔)
- 面向对象(oop):以事务为中心的编程思想
- 面向对象则出现得更晚一些,典型代表为Java或C++等语言,更加适合用于大型开发场景。
- 面向对象:程序员面向的是一个功能对象,不关心功能的具体实现步骤,只关心功能对象是否具有要实现的功能。
- 只关心该对象是否能够完成程序员想要做的事情
- 面向对象:程序员 -> 功能对象.功能方法()
俗一点说:从对象到方法 狗(吃,翔)
类和对象
-
类(class):某种类型集合的描述,事或物的一个分类。
- 类是对一类具体的事物的抽象的概括,具有相似内部状态和运动规律的实体的集合,具有相同属性和行为事物的统称,是抽象的;
- 拥有相同(或者类似)属性和行为的对象都可以抽像出一个类。
-
对象(Object):具体到某一个事或物可以成为对象,现实世界中的对象有属性,行为。
- 对象是一个具体的事物,在现实世界中可以是看得见摸得着的,可以直接使用的;
-
属性:类本身的一些特征
-
方法:类所实现的行为
-
类和对象的关系: 先有类,然后通过类可以创建对象
类的构成:
- 类的抽象: 把现实生活中事或者物归纳到那一类(可以在抽象成程序中的类)
- 类名
- 属性(特征)
- 方法(行为,能干什么)
类的命名:
- 类名要使用大驼峰命名法: 每一个单词的首字母都大写。
类的定义:
- 新式类:推荐大家使用的
- 使用新式类的方式定义一个人类。
- 小括号里面指定的继承的父类,Object是所有类的最顶级的父类。
class Person(object):
# 属性
# 方法
def run(self):
print("跑起来")
# 查看继承的父类
print(Dog.__bases__)
- 旧式类(经典类),不推荐大家使用
- 使用旧式类的方式定义一个狗类,在Python3里面默认继承是object类。
- 扩展:在Python2里面旧式类表示没有继承父类
# class Dog():
class Dog:
# 属性
# 方法,函数放到类里面我们称为是方法
def watch_door(self):
print("看门")
# 查看继承的父类
print(Dog.__bases__)
扩展:定义一个空类
# 扩展:可以定义一个空类
class Student(object):
# 只是代码的占位关键字,保证代码的语法不出错
# 方法和属性都是可选的
pass
创建对象
- 创建的每一个对象都是独立,不是同一个对象。
self是什么
- 类中定义的许多方法,除了之后会提到的类方法和静态方法以外,其他任何的方法当被对象调用时,Python解释器都会把这个对象作为这个方法的第一个参数传入,所以定义这些方法时,必须写上第一个参数,往往写成self去接收。因此在这些方法中,self就可以直接被当做当前对象来使用。
- self参数可以修改成其它名字,但是不建议这样操作,因为看到self参数程序员会知道这是一个对象方法。
- 注意:对象调用对象方法时,self参数不需要程序自己传入,因为Python解释器会帮我们自动把当前调用该方法的对象传入过去。
class Dog(object):
# 方法
def watch_door(self):
print("watch_door:", id(self))
# self:表示调用该方法时的对象,通常说是当前对象
print("正在看门")
# 创建对象
dog1 = Dog() # 类名 + ()就是创建对象
dog2 = Dog()
# 查看内存地址
print("dog1:", id(dog1))
print("dog2:", id(dog2))
# 对象调用方法,
# 相当于-> dog1.watch_door(dog1),但是()里的对象我们不能写
dog1.watch_door()
dog2.watch_door()
添加、获取对象属性
方式之一:后续开发不会使用此方式,因为不通用!
# 结合上面的代码
# 给小狗1对象添加属性
dog1.name = '大黄'
dog1.age = 10
dog1.sex = '公'
# 获取对象属性
print(dog1.name, dog1.age, dog1.sex)
# 不通用原因:dog2并没有这些属性,报错
print(dog2.name, dog2.age, dog2.sex)
类属性和实例属性(对象属性)
- 类属性:在类内部和init方法外部定义的属性称为类属性,类属性属于类。
- 实例属性也称为对象属性:在init方法内部定义的属性称为实例(对象)属性,实例(对象)属性属于对象(实例)。
class Person(object):
# 定义类属性
country = "中国"
def __init__(self, name, age):
# 实例属性或者对象属性
self.name = name
self.age = age
# 创建对象(实例), 严格来说我们应该称为是实例,因为在Python里面一切皆对象,
# Person类也可以称为是对象
p1 = Person("李四", 20)
# 通过p1这个实例(对象)可以访问实例(对象)属性
# 注意:实例属性需要通过实例来操作
print(p1.name, p1.age)
# 注意点: 类属性需要通过类来操作
print('类调用类属性:', Person.country)
print('对象调用类属性:', p1.country)
print(p1.__dict__)
# {'name': '李四', 'age': 20}
# 不是修改类属性,是添加了一个对象属性
p1.country = '中华人名共和国'
print('类调用类属性:', Person.country)
print('此时的相当于对象调用自己的属性:', p1.country)
print(p1.__dict__)
# {'name': '李四', 'age': 20, 'country': '中华人名共和国'}