Python面向对象编程04:重写object通用函数

简介: 正式的Python专栏第39篇,同学站住,别错过这个从0开始的文章!

前篇学委展示分享了类的继承和重写,面向对象还有一些概念,我们看看一些object的通用函数,继续跟上吧!


Python Override

重写就重新定义,在程序中就是覆盖父类的函数的这种行为。


Override还能重写object类的一些通用函数,它们是:


__init__

__str__

__eq__

这里手动写几个,也无须全部记忆。


因为我们双击object这个base class可以看到一系例的object类的函数:


image.png

学委准备了下面的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/15 11:58 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : __init__.py.py
# @Project : hello
"""
下面是一个程序员类定义
"""
class Programmer(object):
    def __init__(self, name):
        self.name = name
    def code(self):
        print(f"{self.name}: life is short, why not python?")
p = Programmer("学委粉丝")
# p.code() #TypeError: code() missing 1 required positional argument: 'lang'
p.code()
print("p:", p)
print("namespace:", Programmer.__dict__)
class JavaProgrammer(object):
    def __init__(self, name):
        self.name = name
    def code(self):
        print(f"{self.name}: like if like a box of chocolate?")
    def __str__(self):
        return f"JavaProgrammer(name:{self.name})"
p = JavaProgrammer("学委粉丝2号")
# p.code() #TypeError: code() missing 1 required positional argument: 'lang'
p.code()
print("p:", p)

这是运行结果:

image.png

我们下面在上面的代码基础上重写__eq__ 函数。

重写 == 操作:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/15 11:58 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : __init__.py.py
# @Project : hello
"""
下面是一个程序员类定义
"""
class JavaProgrammer(object):
    def __init__(self, name):
        self.name = name
    def code(self):
        print(f"{self.name}: like if like a box of chocolate?")
    def __str__(self):
        return f"JavaProgrammer(name:{self.name})"
    def __eq__(self, other):
        if isinstance(other, self.__class__):
            return self.name == other.name
        return False
p1 = JavaProgrammer("学委粉丝2号")
# p.code() #TypeError: code() missing 1 required positional argument: 'lang'
p1.code()
print("p1:", p1)
p2 = JavaProgrammer("学委粉丝2号")
# p.code() #TypeError: code() missing 1 required positional argument: 'lang'
p2.code()
print("p2:", p2)
print("same ? ", p1 == p2)

重写之后两个对象果然相等了!(可能初学者会觉得有点奇怪,name不是一样吗)

在Python中两个对象属性都相同,但是它们不一定相等的。

image.png

这是注释了eq函数后到运行结果:

image.png

Python 默认不支持方法重载!

什么是重载?

重载这种行为就是一个类出现多个同名函数,必然的函数接收的参数不一样(一样不就重复定义了,在Java代码里直接就报错了!)


这在Python中默认不支持的。


我们看看下面的代码,学委写了两个同名函数code但是参数数量稍微区别开了:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/15 11:58 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : __init__.py.py
# @Project : hello
"""
下面是一个程序员类定义
"""
class Programmer(object):
    def __init__(self, name):
        self.name = name
    def code(self):
        print(f"{self.name}: life is short, why not python?")
    def code(self, lang):
        print(f"{self.name}: life is short, why not {lang} ?")
p = Programmer("学委粉丝")
#下面的代码取消注释会报错
#p.code() #TypeError: code() missing 1 required positional argument: 'lang'
p.code("java")
print("namespace:", Programmer.__dict__)

运行结果如下:

image.png

这里我把运行结果的namespace复制出来了:


namespace: {’__module__’: ‘__main__’, ‘__init__’: <function Programmer.__init__ at 0x1042ad280>, ‘code’: <function Programmer.code at 0x104494d30>, ‘__dict__’: <attribute ‘__dict__’ of ‘Programmer’ objects>, ‘__weakref__’: <attribute ‘_weakref_’ of ‘Programmer’ objects>, ‘__doc__’: None}


我们看到namespace里面只有一个code,这告诉我们在内存中,python这个类值映射到一个code函数,明显是后者(第二个code函数)。


但是有库可以做到重载,后面继续说。


总结

读者还可以选取一些object的函数进行重写试试。


类继承带来便利的同时,也带来了复杂度。


因为有时候子类调用父类完成一部分工作,父类调用其他,这样反反复复,整个函数处理逻辑就非常难以一目了然看明白,只能通过看局部代码跳来跳去的拼凑成一个接近全貌的认识。


好处就是重复做的代码少了,组件更加简洁。


学委写了十几年的Java了,但是写的这套Python教程非常务实,对基础编程有任何问题请查看相关文章。


目录
相关文章
|
9月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
493 2
|
9月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
1545 1
|
9月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
409 0
|
10月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
382 101
|
10月前
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
313 99
|
10月前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
546 98
|
10月前
|
缓存 Python
Python中的装饰器:优雅地增强函数功能
Python中的装饰器:优雅地增强函数功能
|
11月前
|
Python
Python 函数定义
Python 函数定义
939 155
|
12月前
|
PHP Python
Python format()函数高级字符串格式化详解
在 Python 中,字符串格式化是一个重要的主题,format() 函数作为一种灵活且强大的字符串格式化方法,被广泛应用。format() 函数不仅能实现基本的插入变量,还支持更多高级的格式化功能,包括数字格式、对齐、填充、日期时间格式、嵌套字段等。 今天我们将深入解析 format() 函数的高级用法,帮助你在实际编程中更高效地处理字符串格式化。
772 0
|
12月前
|
JavaScript 前端开发 开发者
讲述Vue框架中用于对象响应式变化的Object.defineProperty函数。
综上所述,Vue.js通过 `Object.defineProperty()`提供了强大的响应式能力,使得状态管理变得简洁高效。这种能力是Vue.js受到广大开发者青睐的重要原因之一。尽管Vue 3.x使用Proxy替代了该方法,但对于Vue 2.x及其之前版本,`Object.defineProperty()`是理解Vue.js内部工作机制不可或缺的一部分。
309 27

热门文章

最新文章

推荐镜像

更多