文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python相关问题代码分析

2023-07-06 00:41

关注

这篇文章主要介绍“Python相关问题代码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python相关问题代码分析”文章能帮助大家解决问题。

1、反射算术运算符

你可能知道 Python 里面的魔法函数,比如 __add__ 和 __sub__ 代表 + - 运算符,表示 obj +/- something,但你可能不知道还有一个 __radd__,__rsub__ 函数,可以表示 something +/- obj。

举例如下:

class Dog:def __add__(self, other):return "from __add__"def __radd__(self, other):return "from __radd__"dog = Dog()print(dog + 1) # from __add__print(1 + dog) # from __radd__
2、__getattr__ vs __getattribute__

__getattr__ 魔术方法只有在我们试图获取不存在的属性时才会被调用,__getattribute__ 在每次我们尝试访问属性时都会被调用。

代码如下:

class Dog:def __init__(self, name, age):self.name = nameself.age = agedef __getattr__(self, key):return f"{key} not found"dog = Dog("taidi", 5)print(dog.name)# taidiprint(dog.age) # 5print(dog.breed) # breed not found
class Dog:def __init__(self, name, age):self.name = nameself.age = agedef __getattribute__(self, key):return f"{key} not found"dog = Dog("taidi", 5)print(dog.name)# name not foundprint(dog.age) # age not foundprint(dog.breed) # breed not found
3、super().__init__() 的另一种写法
class Animal:def __init__(self, name, age):self.name = nameself.age = ageclass Dog(Animal):def __init__(self, name, age, breed):super().__init__(name, age)self.breed = breed

等价于:

class Animal:def __init__(self, name, age):self.name = nameself.age = ageclass Dog(Animal):def __init__(self, name, age, breed):Animal.__init__(self, name, age)self.breed = breed

请注意,Animal.__init__(self, name, age) 不能少了 self 参数。

4、检查子类的方法
class Animal: passclass Dog(Animal): passclass Cat(Animal): passclass GermanSheperd(Dog): passprint(Animal.__subclasses__())# [,]

不过,.__subclasses__() 只能检查直接子类。

5、多重集成时,同名函数,子类用的是哪一个?
class A:def test(self):print("A")class B:def test(self):print("B")class C(A, B):passC().test() # A

A 和 B 都有 test 方法,那么 C 到底集成了哪一个呢?在 Python 中,最左边的类优先。

在这里,A 是最左边的父类,因此 A 的 test 方法被集成。

多充继承让人困惑,不用为好。

6 __invert__ 魔法函数
class Dog:def __invert__(self):return "test"dog = Dog()print(~dog) # test

~ 运算符代表“按位非”,通常用于反转内容。一个更有意义的例子如下:

class Coordinate:def __init__(self, x, y):self.x = xself.y = ydef __str__(self):return f"({self.x}, {self.y})"def __invert__(self):return Coordinate(-self.x, -self.y)a = Coordinate(3, 4)b = ~aprint(a, b) # (3, 4) (-3, -4)
7、不使用 class 来创建类
def init(self, name, age):self.name = nameself.age = agedef bark(self):print("woof")Dog = type("Dog", (), {"__init__":init, "bark":bark})dog = Dog("taidi", 10)print(dog.name)print(dog.age)# taidi# 10

在这里,我们将 3 个参数传递给 type 以创建我们的类。

第一个参数 __name__ 是类的名称 第二个参数 __bases__ 是一个包含父类的元组 第三个参数 __dict__ 是一个包含属性和方法的字典。

等价于:

class Dog:def __init__(self, name, age):self.name = nameself.age = agedef bark(self):print("woof")

关于“Python相关问题代码分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯