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

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

创建类

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

创建一个类:

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

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


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


类对象的使用

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

访问或修改类对象具有的实例变量,甚至可以添加新的实例变量或者删除已有的实例变量;

调用类对象的方法,包括调用现有的方法,以及给类对象动态添加方法。


下面验收如何使用:

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

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

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


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

可以这样补全代码

class Point:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
if __name__ == '__main__':
    points = []
    for i in range(1000):
        points.append(Point(i,i,i))

抽象类

抽象类概念:

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


python中的abc模块

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


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

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

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

补全代码如下

class BasePoint:
    def __init__(self, x, y, z) -> None:
        self.x = x
        self.y = y
        self.z = z
    @abc.abstractmethod
    def dot(self, right):
        pass

访问限制

为什么要做访问限制

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


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

默认情况下,可从外部访问对象的属性。若让属性不能从对象外部访问,可将属性定义为私有。

私有属性只能通过存取器方法来访问

Python没有为私有属性提供直接的支持,要让方法或属性成为私有的(不能从外部访问),只需让其名称以两个下划线打头即可

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

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

class Apple(): 
    def __setAge(self,age):
       self.__age = age
    def getName(self):
        return self.__name
    def info(self,age):
      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()函数


相关文章
|
20天前
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
20 2
|
20天前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
17 1
|
6月前
|
Python
Python编程作业五:面向对象编程
Python编程作业五:面向对象编程
67 1
|
2月前
|
存储 Java 程序员
30天拿下Python之面向对象编程
30天拿下Python之面向对象编程
16 3
|
6月前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
2月前
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。
|
20天前
|
Java Python
Python学习六:面向对象编程(上)
这篇文章是关于Python面向对象编程的基础知识,包括类和对象的概念、实例方法、属性、self关键字以及魔法方法等。
15 0
|
2月前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
3月前
|
Python
Python 中的面向对象编程 (OOP)
【8月更文挑战第29天】
30 7
|
3月前
|
机器学习/深度学习 PHP 开发者
探索PHP中的面向对象编程构建你的首个机器学习模型:以Python和scikit-learn为例
【8月更文挑战第30天】在PHP的世界中,面向对象编程(OOP)是一块基石,它让代码更加模块化、易于管理和维护。本文将深入探讨PHP中面向对象的魔法,从类和对象的定义开始,到继承、多态性、封装等核心概念,再到实战中如何应用这些理念来构建更健壮的应用。我们将通过示例代码,一起见证PHP中OOP的魔力,并理解其背后的设计哲学。