广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python OOP 面向对象编程
  • 153
分享到

Python OOP 面向对象编程

面向对象PythonOOP 2023-01-31 07:01:03 153人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

参考:黑马程序员教程 - Python基础 面向对象 OOP三大特性,且三个特性是有顺序的: 封装 继承 多态 封装 指的就是把现实世界的事务,封装、抽象成编程里的对象,包括各种属性和方法。这个一般都很简单,不需要多讲。 唯一要注意的

参考:黑马程序员教程 - Python基础 面向对象

OOP三大特性,且三个特性是有顺序的:

  • 封装
  • 继承
  • 多态

封装

指的就是把现实世界的事务,封装、抽象成编程里的对象,包括各种属性和方法。
这个一般都很简单,不需要多讲。

唯一要注意的就是:推荐从小往大开始封装、开发类。比如手枪,子弹这两个类,我们需要先定义和开发子弹的所有属性和方法,然后再去开发上一层的手枪。这样的话会很方便。反过来开发手枪的适合,发现写到一半写不下去要到子弹那里写,就很乱了。

继承

子类可以继承父类和父父类的所有属性、方法。

继承格式:

class Parent:
    def func1(self):
        pass

class Son(Parent):
    def func2(self):
        func1()

方法改写:
子类在不满意时,也可以进行自己的改写父类的属性、方法。
其中有两种情况:

  • Overwrite 覆盖重写父类方法:只需要写一个同名函数即可覆盖。
  • Extend 扩展父类函数:

    • 第一种方式(主要):写一个同名函数,并在其中通过super().func()引用父类方法。其中super是一个python builtin 特殊类,而super()即生成一个super的实例。在子类中生成super实例,会得到父类的引用。
    • 第二种方式(Python 2.x以前使用):写一个同名函数,再通过ParentName.func(self)引用父类方法。但是不推荐,因为父类名称改变的话所有的子类都要改。

私有不继承:
子类能够继承的只是父类的公开内容,但是不包括父类的私有内容。
如果要访问的话也可以,但是需要间接的调用父类再用方法调用私有内容。

多继承

Python中,子类是可以同时有多个父类的:也就是能够同时继承多个父类的所有属性、方法。

继承格式:

class Father:
    def func1(self):
        pass

class Mother:
    def func2(self):
        pass

class Son(Father, Mother):
    def func3(self):
        func1()
        func2()

注意:
如果多个父类间存在有同名的方法,那么会继承第一个父类的方法。

MRO, Method Resolution Order

查看继承顺序:
通过类自带的.__mro__属性(MRO, Method Resolution Order),可以查看这个类的继承顺序。

子类可以直接写FatherName.func()来调用父级函数。
但是当子类用super().func()时候,python就会根据MRO顺序,由近到远逐次寻找,找到最近的上级则返回。

用上例,如果是多继承的话,那么寻找顺序是:SON -> Father -> Mother -> object

查看类的内置属性和方法:

dir(className)可以查看内置所有属性方法。

Python内置的object基础类

python3开始使用新式的类定义,即默认让所有定义的类都自动继承一个叫object的内置基础类。object基础类定义了很多方便的属性。包括18项之多。
而旧式的Python2.x时代,不继承object基础类,自己定义的类就只有__doc____module__两样内置属性而已。2.x时代,如果需要手动继承,如:

class MyClass(object):
    pass

多态

多态是指,不同的子类对象调用相同的父类方法,会产生多态多样结果的编程特性。
多态的前提是能够继承父类的方法,且能够重写改写父类的方法。

多态的特点:

  • 是调用方法的技巧,而不影响类的内部设计
  • 可以增加代码灵活度
def Father():
    def work(self):
        do_job()
     
    def do_job(self):
        print('Farming on the field...')


def Son(Father):
    def do_job(self):
        print('Programming at an office...')

# ---- Now let's work ----
Jason = Son()
Jason.work()

以上代码中,同样是work()函数,且要do_work()。但是,不同的人调用的是不同的do_work
Father调用自己的do_work,儿子因为自己重写了do_work,所以调用自己的方法。
这就是多态——所继承的方法,不需要再特殊指定谁用什么方法,而对象会自动调用适合自己的方法。

类与实例

Python中,实例是一个对象,类也是一个对象,一切皆对象。但这也是Python OOP中引起很多麻烦的原因。

实例对象非常好理解,也好用,直接用,就不说了。但是类对象就不那么好理解了。

简单说,类对象也是一个标准的对象,有自己的属性和方法,只不过能够像模版一样生成多个实例对象而已。
类对象有这两大研究点:

  • 类属性:就是能让所有实例访问和操作的公用厕所

    • 定义类属性:位于class的所有方法之外
    • 访问类属性:className.propertyName
  • 类方法:比较难理解,必须用到名为@claSSMethod的装饰器,函数的第一个参数必须是关键字cls,如同self

    • @classmethod装饰器:用来告诉解释器这是一个类方法,而不是实例方法。
    • cls参数:

类属性与实例属性

这是Python OOP中困扰很多人的特点。但是其实不难理解,总结如下:

class MyClass:
    # 在这个位置定义的,叫类属性。==等同于其它语言的“静态属性”
    # 这是每个实例共有的公用属性,相当于宿舍的公用洗澡间
    count = 0
    
    def __init__(self):
        # 用self.定义的,叫实例属性,是每个实例只自己所有的属性,selfish
        self.name = "Jason"

访问类属性的方法有两种:

  • ClassName.propertyName:推荐,直接用类名访问类属性。
  • Instance.propertyName:不推荐用实例名访问类属性,因为如果需要写入操作,那么这种方法只会给自己添加一个实例属性,而不会影响类属性。

动态添加类属性

方法一:

>>> MyClass.newAttribute = 'I am a class attribute'
>>> print( MyClass.newAttribute )
'I am a class attribute'

方法二:装饰器

# Customized decorator for classproperty
class classproperty(object):
    def __init__(self, getter):
        self.getter= getter
    def __get__(self, instance, owner):
        return self.getter(owner)

class MyClass:
    @classproperty
    def newAttribute(cls):
        return 'I am a class attribute.'

>>> print( MyClass.newAttribute )
'I am a class attribute'

之所以把方法封装为一个类属性,是因为我们有时候需要根据其它类属性来定制这个类属性。
而一般情况下,我们没法在类属性定义的时候获得当前的类或类中其它的属性。

类方法

类方法如同类属性,是属于全类的方法,但是(推荐)只用来访问类属性。

类方法:比较难理解,必须用到名为@classmethod的装饰器,函数的第一个参数必须是关键字cls,如同self

  • @classmethod装饰器:用来告诉解释器这是一个类方法,而不是实例方法。
  • cls参数:如同self,用来指代当前的类。

注意:@classmethodcls都是关键字,不能改。

代码:

class MyClass:
    # 定义一个“类属性”
    count = 0
    
    # 这里开始定义“类方法”
    @classmethod
    def func(cls):
        print(cls.count)

类静态方法

类中的staticmethod装饰器同样是python基础类object的一个用于包装、装饰的方法。一旦在类方法前放上装饰器@staticmethod,方法就会转换为一个静态方法
静态方法就是一个非常独立的方法:既不访问实例的信息,也不访问类的信息。

代码:

class MyClass:
    # 定义一个“类属性”
    count = 0
    
    # 这里开始定义“类方法”
    @staticmethod
    def func():
        pass

Property属性

类中的property装饰器,也是python基础类object的一个用于包装、装饰的方法。一旦类方法前放上装饰器@property,方法就会转换为一个类属性。很多时候把方法伪装成属性,是非常方便的。

class MyClass:
    # 这里开始定义由方法转换为“类属性”
    @property
    def name(self):
        return "Jason"

c = MyClass()
print( c.name )

在继承object基础类的情况下,python给出了三种类属性装饰,对应三种操作:

  • 读取:@property
  • 写入:@name.setter
  • 删除:@name.deleter

也就是说,当你读取类属性my_name的时候,会调用被@property修饰的方法;当你修改my_name当时候,会调用被@my_name.setter修饰的方法;当你删除这个属性时,会调用被@my_name.deleter修饰的方法。

注意:

  • 其中@property, @*.setter, @*.deleter,这是固定的名字,不能改。
  • 三种操作所修饰的三个函数,必须都是同一个名字:即“类属性”名。

代码:

class MyClass:
    # 这里开始定义由方法转换为“类属性”
    @property
    def name(self):
        return "Jason"

    @name.setter
    def name(self, value):
        self.name = value

    @name.deleter
    def name(self):
        del "Jason"

c = MyClass()

print( c.name )  # READ
c.name = "Brown"  # SET
del c.name  # DELETE

property属性的应用

很多OOP语言,针对property属性,一般操作是:一个私有属性,配合两个公有方法
如:

class MyClass:
    def __init__(self):
        self.__name = "Jason"

    def get_name(self):
        return self.__name

    def set_name(self, value):
        self.__name = value

c = MyClass()

# 开始调用
c.set_name("Brownee")
print( c.get_name() )

在Python下,可以利用装饰器改为以下代码,极大方便调用的过程:

class MyClass:
    def __init__(self):
        self.__name = "Jason"

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, value):
        self.__name = value

c = MyClass()

# 开始调用
c.name = "Brownee"
print( c.name )

--结束END--

本文标题: Python OOP 面向对象编程

本文链接: https://www.lsjlt.com/news/192259.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python OOP 面向对象编程
    参考:黑马程序员教程 - Python基础 面向对象 OOP三大特性,且三个特性是有顺序的: 封装 继承 多态 封装 指的就是把现实世界的事务,封装、抽象成编程里的对象,包括各种属性和方法。这个一般都很简单,不需要多讲。 唯一要注意的...
    99+
    2023-01-31
    面向对象 Python OOP
  • python面向对象OOP入门
     一、面向对象简介      面向对象编程不是python独有,几乎所有高级语言都支持;面向对象不管在那个语言中都有三大特性:即:封装、继承、多态;具体的本文主要讲python面向对象--类及三大特性的具体实现;二、面向对象之python类...
    99+
    2023-01-31
    面向对象 入门 python
  • 浅谈Python面向对象编程oop思想心得
    花了几个小时给小表弟普及了一下OOP的知识,索性总结一下写篇文章。 OOP全称Object Oriented Programming 即面向对象编程,之所以有这么一个奇怪的称呼,是因...
    99+
    2022-11-12
  • OOP面向对象编程的概念是什么
    面向对象编程(Object-Oriented Programming,OOP)是一种编程范式或编程思想,它将计算机程序组织为对象的集...
    99+
    2023-10-25
    OOP
  • python 面向对象编程
    文章目录 前言如何理解面向对象编程在 python 中如何使用面向对象编程定义类创建对象self添加和获取对象属性添加属性类外添加属性类中添加属性 访问属性类外访问属性类中访问属性 ...
    99+
    2023-08-31
    python 开发语言
  • Python面向对象编程
      面向对象最重要的概念就是类(Class)和实例(Instance),Java比较熟了,下面贴代码注释   class Student(object): def __init__(self, name, score): ...
    99+
    2023-01-30
    面向对象 Python
  • Python-面向对象编程
    面向对象最重要的概念就是类(Class)和实例(Instance),类是抽象的模板,比如人类、动物类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。 以人类为例,创建一个实例为 xiaomi...
    99+
    2023-01-31
    面向对象 Python
  • js面向对象编程OOP及函数式编程FP区别
    目录写在前面javscript 中函数和对象的关系面向对象编程(OOP)继承多态封装函数编程编程(FP)闭包和高阶函数柯里化偏函数组合和管道函子写在最后写在前面 浏览下文我觉得还是要...
    99+
    2022-11-13
  • Python面向对象编程(三)
    目录一、isinstance和issubclass二、反射(hasattr和getattr和setattr和delattr)1、反射在类中的使用2、反射在模块中的使用3、实例:基于反...
    99+
    2022-11-11
  • Python面向对象编程(二)
    目录一、对象的继承1、类的构造函数继承__init__():2、继承关系中,对象查找属性的顺序二、类的派生1、派生方法一(类调用)2、派生方法二(super)三、类的组合四、多父类继...
    99+
    2022-11-11
  • Python面向对象编程(一)
    目录一、程序中定义类和对象1、 定义类2、 定义对象二、定制对象独有特征1、引入2、定制对象独有特征3、对象属性查找顺序4、类定义阶段定制属性三、对象的绑定方法1、类使用对象的绑定对...
    99+
    2022-11-11
  • Python面向对象编程 一
    一、类    面向对象是对函数进行分类和封装,其主要目的是提高程序的重复实用性,让开发更方便快捷。    在我们的认知中,我们会根据属性相近的东西归为一类。例如:鱼类,鱼类的共同属性是呼吸,卵生。任何一个鱼都在此鱼类基础上创建的。    定...
    99+
    2023-01-31
    面向对象 Python
  • python 面向对象编程(2)
    文章目录 前言封装多态类属性和实例属性定义以及访问类属性修改类属性实例属性 类方法静态方法 前言 前面我们介绍了 python 类和对象以及继承、私有权限,那么今天我们将来介绍 py...
    99+
    2023-08-31
    python 开发语言
  • C++深入讲解类与对象之OOP面向对象编程与封装
    目录1.面向对象编程2.面向过程性编程和面向对象编程3.类的引入4.类的定义4.1类的两种定义方式4.1.1声明和定义全部放在类体中4.2.2.声明和定义不放在类体中5.类的访问限定...
    99+
    2022-11-13
  • 使用C语言怎么实现面向对象编程OOP
    本篇文章为大家展示了使用C语言怎么实现面向对象编程OOP,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。过程&对象?一个对象就是由或多或少的针对这个对象的过程构成的,当然其中是少不了必要的属性...
    99+
    2023-06-16
  • Python面向对象高级编程
      1、__slots__ Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性 class Student(object): __slots__ = ('name',...
    99+
    2023-01-30
    面向对象 高级编程 Python
  • 【python】面向对象编程之@prop
      @property装饰器作用:把一个方法变成属性调用 使用@property可以实现将类方法转换为只读属性,同时可以自定义setter、getter、deleter方法   @property&@.setter class ...
    99+
    2023-01-31
    面向对象 python prop
  • python面向对象编程小结
    这个是跟着教程一步一步走过来的,所以记下自己学习的过程。 一、类基础 1、类的定义 class <类名>:     <其他语句> class <类名>(父类名):     <其他语句> >...
    99+
    2023-01-31
    小结 面向对象 python
  • Python面向对象编程基础
    面向对象编程是Python中的核心之一,面向对象的核心并不是概念,语法,使用有多么复杂,而是一种编程思想,并不是掌握了类创建与使用就真正掌握了面向对象编程,这需要在不断工作与练习中逐步提升;抛去代码,我们先来看现实世界的基本概念: 类: 我...
    99+
    2023-01-31
    面向对象 基础 Python
  • Python 面向对象编程详解
    Python 面向对象 方法没有重载# 在其他语言中,可以定义多个重名的方法,只要保证方法签名唯一即可。方法签名包含3个部分:方法名、参数数量、参数类型。 Python 中,方法的的...
    99+
    2022-12-30
    python面向对象程序设计 python面向对象的三个基本特征 python面向对象编程简单例子
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作