Python进阶系列:(一)面向对象编程之类、封装、继承、多态

本文介绍了Python面向对象编程的基础,包括类、对象、属性和方法的定义,以及构造方法、封装、继承和多态等核心概念。封装通过将代码放入类或方法中,确保了代码的安全性和复用性;继承允许子类共享父类的属性和方法,实现代码重用;多态则提供了灵活性,允许不同类的对象以统一的方式交互。
摘要由CSDN通过智能技术生成


前言

Python系列文章主要是记录自己学习成果及知识输出整合,提供一个温故而知新的场所。
注意建立自己面向对象编程的思路
面向对象编程:object oriendted programming(oop)
定义:通过对象把程序的逻辑及数据进行封装,通过外部进行访问,从而实现提高代码的重用性、灵活性及扩展性


一、类、对象、属性、方法

1. 什么是对象?

一切皆是对象,对象也是程序的基本单元

2.定义对象

比如:所有人、所有动物
有些对象存在一些相同的行为+相同的属性
那么把这些对象的相同行为、相同属性归到一个类别里,就有了人类、动物类、植物类

3.在面向对象编程中,通过类(Class)来实现

类:用来描述具有相同属性、相同行为的对象的集合
定义类:

Class 类名:
	类主体(描述对象的相同属性及行为)
	
class CrateClass:
	# 以下类主体(描述对象=属性+方法)

	# 对象的数据:属性
	name = ''
	# 对象的行为:方法
	def action(self):
		print('会写代码,是大佬')
# 类不指具体某个对象:类=对象的集合
# 那如何描述具体某个对象?需要进行类的实例化,类的实例化=对象
# 类的实例化 变量名=类名()
CC = CrateClass()
# 对象调用执行某个行为
CC.action()
# 假设有两个对象,张三和李四,都会写代码,符合这个类,都要用到action这个方法
# 首先实例化对象
zs = CrateClass()
ls = CrateClass()
# 然后调用类中的方法
zs.action()
ls.action()	

4.构造方法

class CrateClass:
	def __init__(self, name):
		"""构造方法"""
		# 实例属性,self表示当前类的实例
		self.name = name
	
cc = CrateClass('AA')
bb = CrateClass('BB')

5.类的内置属性

类名.__dict__:类的属性(包含一个字典,由类的数据属性组成)
类名.__doc__:类的文档字符串
类名.__name__:类名
类名.__module__:类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__等于mymod)
类名.__bases__:类的所有父类构成元素(包含了一个由所有父类组成的元组)

6.类的方法

"""实例方法:
第一个参数必须是self的函数(实例方法只能通过对象来引用)
"""
class CrateClass:
    def __init__(self, name):
        """构造方法"""
# 实例属性,self表示当前类的实例
        self.name = name
    def action(self):
        print('会写代码,是大佬')
    
    @classmethod(类方法)
    def class_founction(cls):
        print('这是一个类方法')
	
	@staticmethod(静态方法)
    def j_founction():
        print('这是一个静态方法')

shil = CrateClass('实例')
# 通过对象来引用
shil.action()

"""类方法:
由@classmethod装饰的方法,它的第一个参数不是self,是cls,他表示这个类的本身,可以被类或者类的对象调用
如果方法体中需要涉及调用类的属性及方法,那么可以考虑用类方法实现
"""
# 类方法
shil.class_founction()
CrateClass.class_founction()


"""静态方法:
由@staticmethod装饰的方法,默认是没有参数,可以当做一个普通的函数来使用,只是它定义在类中,如果需要实现的业务不依赖于类中的任何属性及方法,则可以定义一个静态方法(比如:获取系统时间)
可以被类或类的对象引用
"""
# 静态方法
shil.j_founction()
CrateClass.j_founction()

7.内置方法

"""
python中常用的内置方法
"""
# __init__(self,....):构造方法,在生产对象时调用可以用来进行一些初始化操作,不需要显示去调用,系统会默认去执行
# __del__(self,.....):析构方法,在释放对象时调用(创建的对象不再有操作后,会自动去执行),支持重载,不需要显示调用
    def __del__(self):
        print('创建的对象执行完后,会释放对象的内存地址,每个对象都会默认执行一次')
# __str__(self,.....):自定义实例输出方法,写好该方法后,替换实例默认的输出操作
    def __str__(self):
        return 'Heloise'

# __str__  通过对象来默认调用
print(shil)
# __getattribute(self,.):获取实例属性的值,可直接结合对象使用
    def __getattribute__(self, item):
        if item == 'num':
            return '人数'

# __getattribute__(self,.) 获取实例属性的值,可直接结合对象使用
print(shil.num)

8.私有属性及私有方法

"""
私有属性/私有方法:必须以双下划线开头,只能类内部进行访问
"""
class CrateClass:
	def __init__(self):
		# 私有属性,只能在类的内部调用
		self.__name = 'simple'
	# 私有方法
	def __sample(self):
		self.__name = '张三'
		print(f'我的名字是{self.__name}1号')
	def myname(self):
		# 调用私有方法
		self.__sample()
		print(f'我的名字是{self.__name}2号')

sample = CrateClass()
sample.myname()
print(sample._CrateClass__name)

# 私有方法
sample.myname()



二、封装、继承、多态

1.封装

面向对象编程的三大特征:封装、继承、多态
什么是封装?
    封装可以理解为将代码放入一个盒子,这个盒子可以是类、方法、函数。
    封装的目的为了保证变量的安全性,使用者不必在意具体实现细节,而只是通过外部调用即可以访问类的属性及方法。
    封装的具体体现:
        通过类的定义
        通过方法的定义
        从而实现代码的复用性

"""将代码封装到函数"""
# 示例:计算几个数之和,假设1+2+3=。。或2+5+8+9=。。不定长加法
# 那使用封装的思路就是定义一个函数,如 sum(*agrs),*agrs表示无论传入几个值都会将这几个值放入一个元组中,这样我们需要计算几个数之和的时候,
#就可以直接调用sum(*agrs)这个函数,而不用管函数里面的逻辑是怎么实现的,也不用自己重新写逻辑直接复用方法就行
def sum(*agrs):
    sum = 0
    for i in agrs:
        sum = sum + i
    return sum

print(sum(2, 5))

"""将代码封装到类"""
"""
面向对象编程的示例:
小明爱跑步
每次跑步会减肥0.5公斤
每次吃东西体重会增加1公斤
小美的体重是45公斤

思路:
1、找出需求中的对象:小明,小美  定义类--通过实例化类(获取对象)
对象=属性+行为(方法)
属性:名字 体重
方法:跑步 吃东西

"""
class people:
    # 属性:名字 体重
    # 初始化数据
    def __init__(self, name, weight):
        self.name = name
        self.weight = weight

    # 方法
    def running(self):
        """
        跑步会减0.5
        """
        self.weight -= 0.5
        print(f'跑步会减肥0.5,{self.name}当前体重{self.weight}')
    def eat(self):
        """
        吃东西会增加0.5
        """
        self.weight += 0.5
        print(f'吃东西会增加0.5,{self.name}当前体重{self.weight}')

if __name__ == '__main__':
    # main表示当前模块,当程序执行的是当前模块的时候,会执行以下代码,如果上面类被其他代码调用了,在别的模块执行类,下面代码就不会执行
    xiaoming = people('小明', 75)
    xiaomei = people('小美', 45)
    xiaomei.eat()
    xiaoming.running()
"""
示例二:洗衣机洗衣服   放入衣服(人)  放入洗衣液(人)  清洗(洗衣机)  烘干(洗衣机)
面向对象编程思路:
找出需求中的对象: 洗衣机 人
定义两个类
洗衣机:
    属性:衣服、洗衣液
    方法:洗衣、烘干
人:
    属性:
    方法:放衣服、放洗衣液
"""
class wash_machine:
    # 洗衣机的属性
    def __init__(self):
        self.chothes = 0
        self.cleanagent = 0
    # 洗衣机的方法
    def washing(self):
        """洗衣"""
        # 判断洗衣机是否有衣物+洗衣液
        if self.chothes == 0:
            raise Exception('请放入衣服')
        elif self.cleanagent == 0:
            raise Exception('请放入洗衣液')
        else:
            print('开始清洗......结束清洗')

    def drying(self):
        """烘干"""
        if self.chothes == 0:
            raise Exception('主人请放入衣服')
        else:
            print('开始烘干......结束烘干')


class wash_people:
    # 属性
    def __init__(self, name):
        self.name = name
    # 方法
    def input_chothes(self,num, machine1:wash_machine): # 相当于放几件衣服放到洗衣机类里面,两个类要联系起来,相当于创建了一个wash_machine的对象
        """放入衣服"""
        # 衣服数量赋值洗衣机类的实例属性  洗衣机对象.chothes=num
        machine1.chothes=num
        print(f'已放入衣服:{num} 件')
    def input_cleanagent(self, num, machine1:wash_machine):
        """放入洗衣液"""
        machine1.cleanagent=num
        print(f'已放入洗衣液:{num} 毫升')

    def wash(self, machine:wash_machine, chothes_num, cleanagent_num):
        """按下清洗按钮"""
        print(f'{self.name}在操作洗衣机')
        self.input_chothes(chothes_num, haier)
        self.input_cleanagent(cleanagent_num, haier)
        # 洗衣机清洗
        machine.washing()
        # 洗衣机烘干
        machine.drying()


if __name__ == '__main__':
    # main表示当前模块,当程序执行的是当前模块的时候,会执行以下代码,如果上面类被其他代码调用了,在别的模块执行类,下面代码就不会执行
    # 张三开始洗衣服
    zhangs = wash_people('张三')
    haier = wash_machine()
    zhangs.wash(haier, 5, 10)

2.继承

什么是继承?

  • 一个类(子类或派生类)继承另一个类(基类或父类)
  • 继承基类的方法,并且做出自己的改变或扩展
  • 子类共用的一些方法和属性直接调用父类,而不需要自己另外再定义,只需要扩展个性化

二、子类和父类之间的关系
1、子类可以使用父类的属性及方法(实现代码的重用,相同代码不需要重复编写)
2、子类调用方法,先找自己,再找父类,再找父类的父类。。。
3、子类不能继承父类的私有方法及属性
4、子类可以重写父类的方法
        1、覆盖父类的方法
        2、扩展父类的方法
            执行原来的业务逻辑+扩展功能

三、继承分为单继承,多继承
单继承:一个类继承另外一个类
多继承:一个类继承多个类
注意:
某个类存在多继承,在执行某个方法时候,先找自己,然后再按照就近原则的方式找父类

class Animail:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print('吃东西')

    def __test(self):
        print('父类的私有方法')
# 定义一个猫类,定义类的可以共用其他类的方法或属性就可以使用继承,如,猫类可以继承上面的动物类, class cat(Animail)括号里面就是父类
class Cat(Animail):
    def eat(self):
        # 执行父类原来的业务代码  父类名.方法名(self)
        Animail.eat(self)
        print('在吃鱼')

if __name__ == '__main__':
    cat = Cat('ff', 2)
    cat.eat()

3.多态

"""
多态
    不同的类对象调用相同的方法,产生不同的执行结果(呈现多态的形态)
"""

# 示例 :支付渠道:微信支付  支付宝支付  银联支付 --> 三个行为
# 因为渠道不一样,一个渠道归为一个类,那么应该创建三个类
class wx:
    """微信类"""
    def pay(self):
        self.name = '微信'
        print('微信支付')

class yl:
    """银联类"""
    def pay(self):
        self.name = '银联'
        print('银联支付')

class zfb:
    """支付宝类"""
    def pay(self):
        self.name = '支付宝'
        print('支付宝支付')

# 那么使用那种支付方式来买东西,我们可以创建一个选择支付方式的函数
def demo_pay(object):  # object随便定义,这里只是做个例子
    """商品支持各种支付:微信、支付宝、银联"""
    object.pay()
    print(f'通过{object.name}方式支付完成')

# 实例化支付方式的对象
wx = wx()  # 创建微信的对象
yl = yl()
zfb = zfb()
demo_pay(yl)

总结

以上就是文章要表达的内容,本文简单介绍了Python的类、对象、属性、方法及面向对象编程的三大特征(封装、继承、多态)的概念以及应用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值