龙空技术网

Python基础编程——魔法方法(续)

Python编程爱好者 214

前言:

如今我们对“python speak函数”可能比较重视,咱们都想要剖析一些“python speak函数”的相关文章。那么小编同时在网摘上汇集了一些关于“python speak函数””的相关文章,希望看官们能喜欢,咱们快快来学习一下吧!

在前面的章节中我们介绍过Python中的一些常用的特殊方法(魔法方法),例如:__init__()、__new__()、__str__()、__dir__()、__del__()等方法。在Python中特殊方法均称之为魔法方法,在以后的章节中,我们也遵循这一称谓。本节将继续介绍一些魔法方法。只要我们在对象中实现了这些魔法方法,那么他们将会在特定情况下被Python调用,而几乎不需要我们直接去调用。

调用未关联的超类构造函数

在前面的章节中我们介绍过子类继承父类后需要继承父类的构造函数以及如何调用父类(超类)的构造函数,之前我们只是介绍了使用函数super()来调用父类的构造函数。先看一个实例,当子类不调用父类的构造函数,会出现什么情况呢?具体如下rewtire_construction.py程序所示:

rewrite_construction.py#!/usr/bin/env python# -*- coding: utf-8 -*-class Person:    def __init__(self, name, age):        self.name = name        self.age = age        self.hungry = True    def speak(self):        print('大家好,我的名字是:{},我的年龄是{}。'.format(self.name, self.age))class Student(Person):    def __init__(self, course):        self.course = course    def study(self):        print('我是一个学生,我正在学习:{}。'.format(self.course))# 创建一个Person对象,并调用对象的方法person = Person('Python编程爱好者', 20)person.speak()# 创建一个Student对象,并调用对象的方法student = Student('Python')student.study()student.speak()程序执行结果如下所示:大家好,我的名字是:Python编程爱好者,我的年龄是20。我是一个学生,我正在学习:Python。Traceback (most recent call last):  File "/Users/guanhu/Projects/python-study/src/magicmethod/rewrite_construction.py", line 46, in <module>    student.speak()  File "/Users/guanhu/Projects/python-study/src/magicmethod/rewrite_construction.py", line 27, in speak    print('大家好,我的名字是:{},我的年龄是{}。'.format(self.name, self.age))AttributeError: 'Student' object has no attribute 'name'

从上面程序的执行结果可以看出,当我们想要在子类中调用父类的方法时,程序出现异常了,提示没有“AttributeError: 'Student' object has no attribute 'name'”,这是因为,我们在子类中重写了父类的构造方法但是却没有任何初始化name和age属性的代码。要消除这种错误,我们需要在子类中调用父类的构造方法,以确保基本的初始化得以执行。这也就是我们前面介绍的需要在子类中调用父类的构造方法的原因,因为我们使用继承时,通常是因为父类的属性不满足需求,需要新增属性,而新增属性的常用方法是在类的构造方法中添加相应的属性,因此会导致重写父类构造方法的情况出现。要调用父类的构造方法实际很容易,也很有用,我们修改上述的rewrite_construction.py程序,具体如下所示:

rewrite_construction.py#!/usr/bin/env python# -*- coding: utf-8 -*-class Person:    def __init__(self, name, age):        self.name = name        self.age = age        self.hungry = True    def speak(self):        print('大家好,我的名字是:{},我的年龄是{}。'.format(self.name, self.age))class Student(Person):    def __init__(self, name, age, course):        Person.__init__(self, name, age)        self.course = course    def study(self):        print('我是一个学生,我正在学习:{}。'.format(self.course))# 创建一个Person对象,并调用对象的方法person = Person('Python编程爱好者', 20)person.speak()# 创建一个Student对象,并调用对象的方法student = Student('Python编程爱好者', 20, 'Python')student.speak()student.study()程序执行结果如下所示:大家好,我的名字是:Python编程爱好者,我的年龄是20。大家好,我的名字是:Python编程爱好者,我的年龄是20。我是一个学生,我正在学习:Python。

在上面的程序中,对实例调用方法时,方法的参数self将自动关联到实例,这称之为关联的方法;而通过类调用方法,例如上面的Person.__init__,就没有实例与之关联,在这种情况下,可以随便设置参数self,这称之为未关联的方法。通过这个未关联方法的参数self将其设置为当前实例,将会使用父类的构造方法来初始化Student对象,即会设置name和age属性。

基本的序列和映射协议

序列和映射基本上是元素的集合,要实现它们的基本行为,不可变对象需要实现2个方法,而可变对象需要实现4个方法。

__len__(self):该方法应返回集合包含的项数,对序列来说是元素的个数,对映射来说是键-值对。需要注意的是,如果__len__返回0,那么在布尔上下文中将被视为假。

__getitem__(self, key):该方法返回与指定键相关联的值,对于序列来说,这里的key指的是索引,即0~n-1,对于映射来说,这里的key指的是键。

__setitem__(self, key, value):该方法应以与键关联的方式来存储值,当且仅当对象为可变对象时才需要实现这个方法。

__delitem__(self, item):该方法在对对象的组成部分使用__del__语句时被调用,删除与key关联的值,当且仅当对象为可变对象时才需要实现这个方法。

由于上述方法我们在实际开发时,很少直接使用到,因此这里不做过多说明,有兴趣的同学可以查看Python的官方文档。

总结

本节作为Python中魔法方法的续集,主要介绍了调用未关联的超类的构造方法以及基本的序列和映射协议。

下一节将会介绍函数property()以及静态方法和类方法等内容,敬请关注!

如果有需要文中小程序的可以私信我哟!

创作不容易,还请点个赞!喜欢的小伙伴请点关注、收藏!

欢迎大家转发、评论!

#python# #Python##Python基础##python打卡##Python编程从入门到实践#

标签: #python speak函数