Python 面向对象
提示:以下笔记,仅代表个人观点和理解,如有错误,可能我理解错了,谢谢斧正
文章目录
一、面向对象是什么意思
面向对象编程是一种编程方法之一,一个方向,根据你需要编写的对象,分类别,基于这些类来创建一个个独立的对象,每个对象都有自己的一套行为和方法,可以根据需求赋予这些对象个性,行为等属性。例如:女娲造人,就是捏很多个小人,但是每个小人都不一样的特征。人,属于人类这一个大类,如果我需要对动物类进行操作,那我需要新建一个动物的类,然后再创建出不同的动物,例如,羊,狗,猪,牛,等等,这些就是对象。
当然,类有大有小,不用一下子就创建很大,属性很多,行为很多,你可以创建一个简单的类,例如:小猫,基本行为就跑,跳,吃。
二、创建和使用
1.创建一个简单的类,并且实例化
代码如下(示例):
# 创建一个猫类
class Cat:
# 初始化,特殊方法,每个类,首先执行的方法
def __init__(self, name):
self.name = name
# 定义一个方法,跳,打印这只猫跳起来了
def jump(self):
print(self.name + '跳起来了')
# 定义一个方法,跑,打印这只猫跑了
def run(self):
print(self.name + '跑了')
cat1 = Cat('小白') # 根据类创建实例 小白
cat2 = Cat('小黑') # 根据类创建实例 小黑
cat1.jump()
cat2.run()
# 打印结果:
# 小白跳起来了
# 小黑跑了
上面看到__init__(self) 这个方法中,这个形参self必不可少,并且必须位于其他形参前面。后面我们看到调用的变量都会加上前缀self,这个self代表这个类,它能提供该类中所有的方法和变量供我们使用。
类中,我们定义了两个方法jump()和run(),我们让对象cat1调用了jump(),从而打印了’小白跳起来’,让对象cat2调用了run(), 打印了’小黑跑了’。
2. 修改属性和增加方法
我们可以在类中,增加多个属性和多个不同的方法,让类更加丰富起来。
代码如下(示例):
# 创建一个猫类
class Cat:
# 初始化,特殊方法,每个类,首先执行的方法
def __init__(self, name, age, sex, cat_type):
self.name = name # 姓名
self.age = str(age) # 年龄
self.sex = sex # 性别
self.cat_type = cat_type # 类型
# 定义一个方法,跳,打印这只猫跳起来了
def jump(self):
print(self.name + '跳起来了')
# 定义一个方法,跑,打印这只猫跑了
def run(self):
print(self.name + '跑了')
# 新增了一个方法,介绍猫的信息
def info(self):
print(f'小猫名字叫:{self.name} 今年 {self.age} 岁了,性别:{self.sex}, 属于 {self.cat_type} 类')
cat1 = Cat('小白', 3, '男', '狸花猫') # 实例化 小白
cat2 = Cat('小黑', 4, '女', '暹罗猫') # 实例化 小黑
cat1.info()
cat2.info()
cat1.sex = '女' # 修改cat1的属性
cat2.cat_type = '雪鞋猫' # 修改cat2的属性
print('=='*20)
cat1.info()
cat2.info()
# 打印结果:
# 小猫名字叫:小白 今年 3 岁了,性别:男, 属于 狸花猫 类
# 小猫名字叫:小黑 今年 4 岁了,性别:女, 属于 暹罗猫 类
# ========================================
# 小猫名字叫:小白 今年 3 岁了,性别:女, 属于 狸花猫 类
# 小猫名字叫:小黑 今年 4 岁了,性别:女, 属于 雪鞋猫 类
上面代码中,在原来的类中init中增加了多个属性(年龄,性别,猫的类型)一个info() 方法,用于打印猫的详细信息。在打印一次信息后,修改了两只猫的不同属性,再打印一次。
3. 方法修改属性
3.1 将属性设置为外部不可调用
主要用法就是类中的属性前面增加__ 两个小下划线 如下的name属性:self.__name
代码如下(示例):
# 创建一个猫类
class Cat:
# 初始化,特殊方法,每个类,首先执行的方法
def __init__(self):
self.__name = '' # 姓名
# 定义set,让外部传入小猫的名字,赋予类中对应的属性
def set_name(self, name):
self.__name = name
# 定义get,能让外部获取到小猫的名字
def get_name(self):
return self.__name
cat1 = Cat() # 实例化
cat1.set_name('小白')
print('小猫名字叫:' + cat1.get_name())
# 打印结果:
# 小猫名字叫:小白
3.1 将方法当成属性来使用
利用属性配置,我们将方法当成属性来调用:
# 创建一个猫类
class Cat:
# 初始化,特殊方法,每个类,首先执行的方法
def __init__(self):
self.__name = '' # 姓名
# 定义set,让外部传入小猫的名字,赋予类中对应的属性
def set_name(self, cat_name):
self.__name = cat_name
# 定义get,能让外部获取到小猫的名字
@property # 赋予属性的功能
def get_name(self):
return self.__name
cat1 = Cat() # 实例化
cat1.set_name('小白')
print('小猫名字叫:' + cat1.get_name)
# 打印结果:
# 小猫名字叫:小白
上面代码中,我们将获取get_name这个方法,增加了@property 这一行,将这个方法设置成可以用调用属性。
三、继承
继承,字面上的理解,可以继承某个东西的属性或者方法,类中也可以,这样子就更加节省脚本和更加容易管理。
代码如下(示例):
# 创建一个猫类 父类,也可以叫做 基类
class Cat:
# 初始化,特殊方法,每个类,首先执行的方法
def __init__(self, name):
self.name = name # 姓名
def info(self):
print('小猫名字叫:' + self.name)
def can_jump(self):
print('我会跳')
class short_cat(Cat): # 定义短尾猫类(父类)
def __init__(self, name):
super().__init__(name) # 调用父类中的__init__()方法
def detail_info(self):
print('我是一只短尾猫')
cat1 = short_cat('小白') # 实例化
cat1.detail_info() # 调用子类中的打印信息
cat1.info() # 调用父类中的打印信息
cat1.can_jump() # 调用父类中的打印信息
# 打印结果:
# 我的一只短尾猫
# 小猫名字叫:小白
# 我会跳
如上脚本所示,如果我们有很多个子类,然后有一个共同的父类,我们可以在父类中定义通用的方法供所有子类调用,然后各个子类就定义属于自己的方法,方便快捷,节省脚本。
1、重写父类的方法
如果子类有方法跟父类产生歧义,可以使用重写父类的方法,使其使用于当前子类。
代码如下(示例):
# 创建一个猫类 父类,也可以叫做 基类
class Cat:
# 初始化,特殊方法,每个类,首先执行的方法
def __init__(self, name):
self.name = name # 姓名
def info(self):
print('小猫名字叫:' + self.name + ', 我的尾巴很长')
def can_jump(self):
print('我会跳')
class short_cat(Cat): # 定义短尾猫类(父类)
def __init__(self, name):
super().__init__(name) # 调用父类中的__init__()方法
def info(self): # 重写父类中的info方法,变成适合自己的方法。
print('小猫名字叫:' + self.name + ', 是一只短尾猫')
# 定义 另外一个子类 长尾猫
class long_cat(Cat):
def __init__(self, name):
super().__init__(name) # 调用父类中的__init__()方法
cat1 = short_cat('小白') # 实例化一个子类
cat1.info() # 调用子类中重写后的方法
cat2 = long_cat('小黑') # 实例化另外一个子类
cat2.info() # 调用父类中的方法
# 打印结果:
# 小猫名字叫:小白, 是一只短尾猫
# 小猫名字叫:小黑, 我的尾巴很长
当然,一个子类重写父类的方法时,作用只在本子类中,父类的方法是不会改动的,其他子类调用不会有影响。(不知道这句话是不是废话。哈哈)
总结
如果有错误或者不对的地方,欢迎斧正,我会立即改。
笔记做完,感觉又更加熟悉了,还是那一句话,多敲代码,多动手,就自然更加熟悉了,后面应用起来也就更加信手拈来了。谢谢大家