• 【21天python打卡】第7天 面向对象编程(2)


    ​大家好,今天是21天python打卡的第7天,上一篇讲了python关于面向对象编程的相关知识,类是什么,以及面向对象三要素。今天我们来说说python如何创建类,抽象类,访问限制的说明。



    活动地址:CSDN21天学习挑战赛

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰


    目录

    创建类

    创建一个类:

    类对象的使用

    抽象类

    抽象类概念:

    python中的abc模块

     访问限制

    为什么要做访问限制

    通过定义私有属性做访问限制

    通过定义私有函数做访问限制;

    特殊情况:

    反射机制

    什么是反射机制


    创建类

    首先,我们创建一个类,示例如下。

    创建一个类:

    1. # -*- coding: UTF-8 -*-
    2. from random import choice
    3. class Divergence:
    4. def __init__(self,name='robot'):
    5. self.name = name
    6. pass
    7. def getChoice(self,name=None):
    8. if name is not None:
    9. self.name = name
    10. self.__lists = ['剪刀','石头','布']
    11. result = choice(self.__lists)
    12. print(self.name,':选择了>',result)

    定义类时,如果没有手动添加 init() 构造方法,又或者添加的 init() 中仅有一个 self 参数,则创建类对象时的参数可以省略不写。

    在上面的代码中,由于构造方法除 self 参数外,还包含 name参数,且设置了默认参数,因此在实例化类对象时,按需传入相应的 name 值(self 参数是特殊参数,不需要手动传值,Python 会自动传给它值)

    类对象的使用

    定义的类只有进行实例化,也就是使用该类创建对象之后,才能得到利用。总的来说,实例化后的类对象可以执行以下操作:

    访问或修改类对象具有的实例变量,甚至可以添加新的实例变量或者删除已有的实例变量;
    调用类对象的方法,包括调用现有的方法,以及给类对象动态添加方法。

    下面验收如何使用:

    1. #实例化对象的时候传递name参数
    2. d = Divergence('A')
    3. d.getChoice()
    4. #实例化时不传递参数
    5. d = Divergence()
    6. #调用方法时传递
    7. d.getChoice('A')

    我们通过实例来说明如何创建对象。

    创建点对象,有多种方式创建一个类的实例,我们称一个点的x、y、z都一样的点为对角点。

    1. # -*- coding: UTF-8 -*-
    2. class Point:
    3. # TODO(You): 添加代码支持类的创建
    4. if __name__ == '__main__':
    5. points = []
    6. # TODO(You): 批量创建1000个对角点,第i个点的坐标是 (i,i,i)
    7. for point in points:
    8. print(point)

     可以这样补全代码

    1. class Point:
    2. def __init__(self, x, y, z):
    3. self.x = x
    4. self.y = y
    5. self.z = z
    6. if __name__ == '__main__':
    7. points = []
    8. for i in range(1000):
    9. points.append(Point(i,i,i))

    抽象类

    抽象类概念:

    • 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化,需要借助python模块实现;
    • 抽象类是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。
    • 抽象类与普通类的不同之处在于:抽象类中有抽象方法,该类不能被实例化,只能被继承,且子类必须实现抽象方法

    python中的abc模块

    • python中需要利用abc模块实现抽象类
    • 抽象类的本质仍是类,指的是一组类的类似性,包括数据属性(如all_type)和函数属性;
    • 抽象类是一个介于类和接口之间的一个概念,同时具有类和接口的部分特性

    下面通过具体python题目说明抽象类的概念

    使用 abc 库,创建抽象 BasePoint 类,创建 Point 子类,实现 dot 抽象方法,计算内积

    1. # -*- coding: UTF-8 -*-
    2. import abc
    3. # TODO(You): 请实现抽象类 BasePoint
    4. class Point(BasePoint):
    5. def __init__(self, x, y, z) -> None:
    6. super().__init__(x, y, z)
    7. def dot(self, right):
    8. return self.x*right.x+self.y*right.y+self.z*right.z
    9. if __name__ == '__main__':
    10. p1 = Point(0, 1, 2)
    11. p2 = Point(2, 4, 6)
    12. assert p1.dot(p2) == 16
    13. p1 = BasePoint(0, 1, 2)
    14. p2 = BasePoint(2, 4, 6)
    15. assert p1.dot(p2) is None

     补全代码如下

    1. class BasePoint:
    2. def __init__(self, x, y, z) -> None:
    3. self.x = x
    4. self.y = y
    5. self.z = z
    6. @abc.abstractmethod
    7. def dot(self, right):
    8. pass

     访问限制

    为什么要做访问限制

    做访问限制,是为了程序的健壮性。如果可以从外部对函数里面重要的属性进行任意修改,有可能程序崩溃只是因为一次不经意地参数修改。

    • 通过定义私有属性做访问限制

    默认情况下,可从外部访问对象的属性。若让属性不能从对象外部访问,可将属性定义为私有。
    私有属性只能通过存取器方法来访问
    Python没有为私有属性提供直接的支持,要让方法或属性成为私有的(不能从外部访问),只需让其名称以两个下划线打头即可

    1. class Apple():
    2. def name(self,name):
    3. self.__name = name
    4. def getName(self):
    5. return self.__name
    • 通过定义私有函数做访问限制;

    与属性一样,只需要在函数名前面添加两个下划线打头既可实现私有函数;

    1. class Apple():
    2. def __setAge(self,age):
    3. self.__age = age
    4. def getName(self):
    5. return self.__name
    6. def info(self,age):
    7. self.__setAge(age);

    • 特殊情况:

    在Python中,以双下划线开头,并且以双下划线结尾的变量是特殊变量如__name__,特殊变量是可以直接访问的;
    按照约定俗成的规定,以一个下划线开头的实例变量名(例如_category) 外部也是可以直接访问的,但是这个形式的变量表达的意思是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”

     

    反射机制

    什么是反射机制

    在 Python 中使用反射可以得到对象的所有属性,这个机制被称为反射(反过来让对象告诉我们他是什么),用于实现在运行时获取未知对象的信息。

    • python中有几个内置方法,可以用来检查或是访问对象的属性。这些方法可以用于任意对象;

    dir([obj]):

    调用这个方法将返回包含obj大多数属性名的列表(会有一些特殊的属性不包含在内)。obj的默认值是当前的模块对象。

    hasattr(obj, attr):

    这个方法用于检查obj是否有一个名为attr的值的属性,返回一个布尔值。

    getattr(obj, attr):

    调用这个方法将返回obj中名为attr值的属性的值,

    setattr(obj, attr, val):

    调用这个方法将给obj的名为attr的值的属性赋值为val。

    type(obj)

    判断对象类型,使用type()函数


    今天就介绍到这里,下一篇我们说说python的基本技能。 

  • 相关阅读:
    算法入门(二):简单排序算法
    Spring Boot 内置工具类应有尽有 建议收藏
    【STM32学习】I2C通信协议 | OLED屏
    计算日期到天数转换
    ROS-TCP-Connector and ROS-TCP-Endpoint
    开源项目管理解决方案Leantime
    时空数据挖掘三(城市计算)
    不同图框架的差异性
    NDArrayPool源代码解析以及测试程序
    5分钟打造好用好看API文档
  • 原文地址:https://blog.csdn.net/BROKEN__Y/article/details/126215932