Python 面向对象

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() # 调用父类中的方法

# 打印结果:
# 小猫名字叫:小白, 是一只短尾猫
# 小猫名字叫:小黑, 我的尾巴很长

当然,一个子类重写父类的方法时,作用只在本子类中,父类的方法是不会改动的,其他子类调用不会有影响。(不知道这句话是不是废话。哈哈)

总结

如果有错误或者不对的地方,欢迎斧正,我会立即改。
笔记做完,感觉又更加熟悉了,还是那一句话,多敲代码,多动手,就自然更加熟悉了,后面应用起来也就更加信手拈来了。谢谢大家

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值