面向对象基础

知识点

备注:类更注重对象和职责,不同的对象承担不同的责任

概念

1
2
3
# 类是一类具有相同特征/行为的事物的统称,是抽象的概念,不能直接使用
# 特征:在类中被称为属性
# 行为:在类中被称为方法
1
2
3
4
5
# 在完成需求前,首先要确定职责 -- 要做的事情(方法)
# 根据职责确定不同的对象(类):
# 将属性和方法封装到一个抽象的类中
# 外界使用类创建对象,然后通过对象调用属性、方法
# 最后完成的代码,就是让不同的对象调用不同的方法

类的设计

1
2
3
4
# 先有类,后有对象
# 类名定义满足大驼峰命名法

# 面向对象设计前,需分析需求,程序中包含哪些类

dir():查看对象的所有属性和方法

1
2
3
4
# 查看对象所拥有的属性、方法
# 1. 在标识符/数据后加.,然后按Tab键
# 2. 使用dir(对象)
dir(对象)

内置函数/方法

方法名 作用
__new__ 创建对象时,自动调用
__init__ 对象初始化时,被自动调用
__del__ 对象从内存中删除,会被自动调用
__dir__ 返回对象的描述信息,print函数输出使用

类的定义和使用

1
2
3
4
5
6
7
8
# 定义类需要使用class
class 类名:

def 方法(self, 参数列表):
方法体

# 创建对象
对象变量 = 类名()

对象的引用

1
2
3
4
# 在python中使用类创建对象(一个变量)以后,该变量记录的仍然是对象在内存中的地址
# 利用print函数输出对象变量,默认情况下能够输出这个变量(引用对象)是由哪一个类创建的对象,以及其在内存中的地址(16进制)

# 计算机中使用16进制表示内存地址,%x可以输出16进制数字

属性

1
2
# (不推荐) 给对象临时添加一个属性,可以通过赋值的方式,
tom.name = "tom" # 此处的tom是一个对象
1
2
3
4
class Cat:
# 哪一个对象调用的方法,self就是哪一个对象的引用
def eat(self):
print("小猫爱吃鱼")

初始化:__init__

1
2
3
4
5
6
7
8
9
10
11
# 使用类名创建对象时,会自动执行如下操作:
# 1. 为对象在内存中分配空间 -- 创建对象
# 2. 为对象的属性设置初始值 -- 初始化方法(__init__)

# __init__是一个专门用来定义一个类具体有哪些属性的方法:self.属性名 = 属性初始值
class Cat:

def __init__(self, name):
self.name = name
# 创建对象时,需要将需要设置的属性值传递进去
tom = Cat("tom")

对象销毁:__del__

1
2
3
4
5
6
7
8
9
10
11
# 一个对象被从内存中销毁之前,会自动调用__del__方法
# 一个对象的__del__方法一旦被调用,生命周期结束
class Cat:

def __init__(self, name):
self.name = name

def __del__(self, name):
print("%s 去了".format(self.name))

tom = Cat("tom")

打印自定义内容:__str__

1
2
3
4
5
6
7
8
9
10
11
12
# 希望print输出变量对象时能够打印自定义的内容,就可以利用__str__这个内置方法
# __str__这个方法必须返回一个字符串
class Cat:

def __init__(self, name):
self.name = name

def __str__(self, name):
print("%s 去了".format(self.name))

tom = Cat("tom")
print(tom)

身份运算符

备注:身份运算符用于比较两个对象的内存地址是否一致 – 是否是对同一个对象的引用,在python中对于None的判断建议用身份运算符进行判断

运算符 描述
x is y 判断x和y是不是引用同一个对象,相当于id(x) == id(y)
x is not y 判断x和y是不是引用不同对象,相当于id(x) != id(y)

is和==的区别:is用于判断两个变量引用对象是否为同一个,==用于判断引用变量的值是否相等

私有属性、方法

备注:在子类中是无法访问父类中定义的私有对象,父类的私有对象只能在父类的内部被其自己的方法所访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 实际开发中,对象的某些属性、方法不希望被外部访问到,只允许在对象的内部被使用,此时就用到私有属性、方法
# 私有属性:对象不希望公开的属性
# 私有方法:对象不希望公开的方法

# 私有属性方法的定义:在属性、方法名前增加两个下划线即可
class Women:
def __init__(self, name):
self.name = name
self.__age = 18 # 定义的__age就是私有属性,只能够在对象内部被访问

def __introduce(self): # 定义的__introduce就是私有方法,只能够在对象内部使用
print("my age is %s" %self.__age)

personal = Women("xx")
print(personal.__age) # 此处是无法访问到该属性的值的,并且报错
print(personal.__introduce()) # 此处也无法调用该方法,且报错

备注:在python中并没有真正意义上的私有属性、方法

1
2
3
# (科普)私有属性的访问方式:对象名._类名__属性名,私有方法类似,但开发中不要使用这种方式访问
print(personal._Women__age) # 可以正常访问私有属性
print(personal._Women__introduce) # 可以正常访问私有方法了

作业

  1. (问答)事物的特征在类中被称为什么,事物的行为在类中被称为什么

  2. (问答)根据需求设计类的过程是什么样的

  3. (问答)类名的定义符合什么规则

  4. (问答)如何查看一个对象中所有的属性和方法

  5. (问答)默认使用print打印一个对象,会得到什么

  6. (问答)内存中的地址常用什么进制

  7. (问答)查看下面的代码,其中方法中的参数self,有什么作用

    1
    2
    3
    4
    class Cat:

    def __init__(self, name):
    self.name = name
  8. (问答)当我们根据一个类创建一个对象时,系统会自动帮助我们做哪些事

  9. (问答)当我们希望能够在对象销毁前,让其能够为我们再做些事,可以使用什么方法

  10. (问答)如果我们希望在打印一个对象时,能够让其输出一段自定义的内容,可以使用什么方法?并且定义时需要注意什么

  11. (问答)开发语言中常说的封装是指什么

  12. 根据以下需求,创建指定的类

    1
    2
    3
    1. 小明体重:75kg
    2. 小明每次跑步都会减肥:0.5kg
    3. 小明每次吃饭体重增加:1kg
  13. (问答)身份运算符包括哪些,它和==运算符有何区别

  14. (问答)在python中,对None类型的判断,建议使用什么的运算符

  15. (问答)在一个类中,如果该类的某些属性、方法不希望被外界调用则可以使用私有化的方式,请问如何定义这类数据

  16. (问答)如果一定要访问python中的私有属性、方法的方式是什么

  17. 根据如下需求,创建类:

    1
    2
    3
    4
    1. 士兵许三多有一把ak47
    2. 士兵可以开火
    3. 枪能够发射子弹
    4. 枪装填子弹 -- 增加子弹数量