Python面向对象的内置方法梳理讲解

 更新时间:2022年10月12日 10:53:44   作者:Python热爱者  
面向对象编程是一种编程方式,此编程方式的落地需要使用“类”和 “对象”来实现,所以,面向对象编程其实就是对 “类”和“对象” 的使用,今天给大家介绍下python 面向对象开发及基本特征,感兴趣的朋友一起看看吧

首先class类里的内置方法,比如:__call__,__str__这些都是在一定条件下自动运行的。

下面我们来介绍几个内置方法

1、__str__

先讲讲他的作用,在print打印对象的时候会自动触发运行

例子1:

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age = age
stu1 = Student('xiaoming',18)
print(stu1)      #运行原理就是,先在Student类里找__str__方法,没有就去他的父类找
print(object.__str__(stu1))   #验证了Student的父类里面有__str__方法

输出结果是

#<__main__.Student object at 0x0000023A1170C128>
#<__main__.Student object at 0x0000023A1170C128>

例子2:

我们可以在Student类自己定义一个__str__方法来验证,执行print打印操作,原理#是执行了__str__方法的

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        print(self.name)
        return '<name:%s age:%s>' %(self.name,self.age)
stu1 = Student('xiaoming',18)
print(stu1)     #这个stu1就是__str__的返回值

输入结果是:

xiaoming
<name:xiaoming age:18>

补充一下,对象的查找属性的顺序:对象自己的名称空间,对象对应类的名称空间,该类的基类的名称空间

2、__del__方法

作用是,会在删除对象之前自动触发该方法

我就直接上代码吧

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __del__(self):
        print('%s 已经被删除' % self.name)
stu1 = Student('xiaoming', 18)
stu2 = Student('zhangsan', 18)
print('主')

他的执行结果是


xiaoming 已经被删除
zhangsan 已经被删除

讲讲为什么是这个输出结果:这个python解释器的垃圾回收机制吧,一个程序运行完毕,python会回收该程序在内存中产生的数据,当执行到print(‘主’),后面没有代码执行了,就会删掉stu1,stu2这两个对象,删除这两个对象之前呢,会执行__del__方法,所以会出现上面的结果。

3、__call__

在调用该对象时,也就是实例化的时候,会自动运行其类和类的基类中的__call__方法,如果没有的,那么该对象是不可调用的对象

class Student:   #补充:class Student: 相当于就是 Student = type(类名,该类的基类们,类体代码产生的名称空间)
    pass
Student()

分析一下:首先一切皆对象,Student就是一个对象,Student他是通过元类(type)实例化得来的,所以说调用Student(),就是去找type元类中找__call__方法去执行,很明显type类中有__call__方法,运行上面那段代码,不会出错。

下面举个例子来验证下上面的结论

class Student:  # (相当于上面例子的type)
    def __init__(self, name, age):
        self.name = name
        self.age = age
stu1 = Student('xiaoming', 18)  # stu1(相当于上面例子的Student)
try:  # 这里我们通过捕捉异常来打印出错原因
    stu1()  # 这里相当于上面Student()
except Exception as e:
    print(e)
    # 打印结果是:'Student' object is not callable
    # “Student”对象不可调用,也就是stu1是不可调用的

结论:通过这两个例子可以得到,只要该对象的类中有__call__方法,那该对象就可以调用,也就是实例化。

该对象实例化,就是运行其类中的__call__方法

验证下:该对象实例化,就是运行其类中的__call__方法

class Teacher:
    def __init__(self, name):
        self.name = name
    def __call__(self, *args, **kwargs):
        print('我被%s调用了' % self.name)
tea1 = Teacher('xiaoming')
tea1()

#输出结果是:我被xiaoming调用了

如何通过元类来控制类的调用

通过在自定义元类里的__call__方法,来实现对类的调用控制

1、首先类的调用原理就是运行元类里的__call__方法

2、通过__call__方法来实现对对象的初始化操作

class Mymeta(type):
    def __call__(self, *args, **kwargs):  # self就是Student *args和**kwargs就是Student后面的参数
        # print(self)
        # print(args)
        # print(kwargs)
        obj = self.__new__(self)  # 就是创建一个Student的空对象
        self.__init__(obj, *args, **kwargs)  # 执行__init__方法    这里需要注意查找顺序
        return obj  # 将实例化完的对象返回回去
class Student(object, metaclass=Mymeta):
    def __init__(self, name, age):
        self.name = name
        self.age = age
stu1 = Student('xiaoming', age=18)
print(type(stu1),stu1.__dict__)

这就是类的实例化的整个过程,不过这是我们通过自定义元类来控制类的调用,也就是再__call__多些代码而已

在默认元类type里,肯定有__call__方法,该方法下面就是产生个空对象,再执行__init__方法

先讲到这三个方法,其他那些__dict__,class,__name__这些就不说了

到此这篇关于Python面向对象的内置方法梳理讲解的文章就介绍到这了,更多相关Python面向对象内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python中np.zeros_like函数用法详解

    python中np.zeros_like函数用法详解

    这篇文章主要介绍了python中np.zeros_like函数用法的相关资料,np.zeros_like是 NumPy 库中的一个函数,用于创建一个与给定数组形状和类型相同的新数组,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-04-04
  • python中文件夹py文件相互引用方式

    python中文件夹py文件相互引用方式

    这篇文章主要介绍了python中文件夹py文件相互引用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • python学习入门细节知识点

    python学习入门细节知识点

    我们整理了关于python入门学习的一些细节知识点,对于学习python的初学者很有用,一起学习下。
    2018-03-03
  • python tkinter实现鼠标悬停提示

    python tkinter实现鼠标悬停提示

    这篇文章主要为大家详细介绍了python如何使用tkinter控件实现鼠标悬停提示以及提示文本动态展示,文中的示例代码讲解详细,有需要的可以参考下
    2024-11-11
  • pycharm永久激活方法

    pycharm永久激活方法

    这篇文章给大家介绍了pycharm永久激活码,通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,对pycharm激活码相关知识感兴趣的朋友一起看看吧
    2020-01-01
  • 简述python四种分词工具,盘点哪个更好用?

    简述python四种分词工具,盘点哪个更好用?

    这篇文章主要介绍了python四种分词工具的相关资料,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04
  • python网络爬虫精解之Beautiful Soup的使用说明

    python网络爬虫精解之Beautiful Soup的使用说明

    简单来说,Beautiful Soup 是 python 的一个库,最主要的功能是从网页抓取数据,Beautiful Soup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能,需要的朋友可以参考下
    2021-09-09
  • python递归计算N!的方法

    python递归计算N!的方法

    这篇文章主要介绍了python递归计算N!的方法,涉及Python递归计算阶乘的技巧,非常简单实用,需要的朋友可以参考下
    2015-05-05
  • numpy中的ndarray方法和属性详解

    numpy中的ndarray方法和属性详解

    这篇文章主要介绍了numpy中的ndarray方法和属性详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • python中xlwt模块的具体用法

    python中xlwt模块的具体用法

    本文主要介绍了python中xlwt模块的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论