Python相关问题代码分析

其他教程   发布日期:2025年02月08日   浏览次数:223

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

1、反射算术运算符

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

举例如下:

  1. class Dog:
  2. def __add__(self, other):
  3. return "from __add__"
  4. def __radd__(self, other):
  5. return "from __radd__"
  6. dog = Dog()
  7. print(dog + 1) # from __add__
  8. print(1 + dog) # from __radd__

2、__getattr__ vs __getattribute__

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

代码如下:

  1. class Dog:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. def __getattr__(self, key):
  6. return f"{key} not found"
  7. dog = Dog("taidi", 5)
  8. print(dog.name)# taidi
  9. print(dog.age) # 5
  10. print(dog.breed) # breed not found
  1. class Dog:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. def __getattribute__(self, key):
  6. return f"{key} not found"
  7. dog = Dog("taidi", 5)
  8. print(dog.name)# name not found
  9. print(dog.age) # age not found
  10. print(dog.breed) # breed not found

3、super().__init__() 的另一种写法

  1. class Animal:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. class Dog(Animal):
  6. def __init__(self, name, age, breed):
  7. super().__init__(name, age)
  8. self.breed = breed

等价于:

  1. class Animal:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. class Dog(Animal):
  6. def __init__(self, name, age, breed):
  7. Animal.__init__(self, name, age)
  8. self.breed = breed

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

4、检查子类的方法

  1. class Animal: pass
  2. class Dog(Animal): pass
  3. class Cat(Animal): pass
  4. class GermanSheperd(Dog): pass
  5. print(Animal.__subclasses__())
  6. # [,]

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

5、多重集成时,同名函数,子类用的是哪一个?

  1. class A:
  2. def test(self):
  3. print("A")
  4. class B:
  5. def test(self):
  6. print("B")
  7. class C(A, B):
  8. pass
  9. C().test() # A

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

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

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

6 __invert__ 魔法函数

  1. class Dog:
  2. def __invert__(self):
  3. return "test"
  4. dog = Dog()
  5. print(~dog) # test

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

  1. class Coordinate:
  2. def __init__(self, x, y):
  3. self.x = x
  4. self.y = y
  5. def __str__(self):
  6. return f"({self.x}, {self.y})"
  7. def __invert__(self):
  8. return Coordinate(-self.x, -self.y)
  9. a = Coordinate(3, 4)
  10. b = ~a
  11. print(a, b) # (3, 4) (-3, -4)

7、不使用 class 来创建类

  1. def init(self, name, age):
  2. self.name = name
  3. self.age = age
  4. def bark(self):
  5. print("woof")
  6. Dog = type("Dog", (), {"__init__":init, "bark":bark})
  7. dog = Dog("taidi", 10)
  8. print(dog.name)
  9. print(dog.age)
  10. # taidi
  11. # 10

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

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

等价于:

  1. class Dog:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. def bark(self):
  6. print("woof")

以上就是Python相关问题代码分析的详细内容,更多关于Python相关问题代码分析的资料请关注九品源码其它相关文章!