专栏名称: 新语数据故事汇
《新语数据故事汇,数说新语》科普数据科学、讲述数据故事,深层次挖掘数据价值。
51好读  ›  专栏  ›  新语数据故事汇

一文带你理解python的面向对象编程(OOP)

新语数据故事汇  · 公众号  ·  · 2024-11-10 13:58

正文

面向对象编程(OOP, Object-Oriented Programming )是一个较难掌握的概念,而 Python 作为一门面向对象的语言,在学习其 OOP 特性时,许多人都会对“继承”和“多态”等概念感到困惑。为了帮助更好地理解这些概念,本文将介绍一些 Python OOP 的小技巧和隐藏特性,这些内容不仅能让代码更简洁、更易读,还能大大提高学习效率,帮助开发者少走弯路。

让我们一起来探索这些实用的 OOP 技巧,助开发者快速上手 Python 的面向对象编程!

1. 使用 __init__ 方法实现更清晰的初始化

__init__ 方法就像是设置类的第一步。每次创建类的一个实例(或对象)时, __init__ 都会被调用来初始化对象。

class Animal:    def __init__(self, name: str, age: int = 1):        self.name = name        self.age = age
dog = Animal("Buddy")cat = Animal("Whiskers", 3)
print(dog.age) print(cat.age)

2. 魔术方法(__str__ 和 __repr__)让调试更轻松

当打印一个对象时,可能会看到 <__main__.animal object at> 这样的输出。这种输出并不直观,无法帮助理解对象的内容。这时,魔术方法 __str__ __repr__ 就派上用场了,它们可以让类的输出更加直观。

  • __str__ :用于创建用户友好的字符串表示。

  • __repr__ :用于调试,提供对象的清晰、准确的“官方”字符串表示。

class Animal:  def __init__(self, name, age):    self.name = name    self.age = age  def __str__(self):    return f"Animal(name={self.name}, age={self.age})"  def __repr__(self):    return f"Animal(name={self.name!r}, age={self.age!r})"
dog = Animal("Buddy", 5)print(dog) dog

3. 理解类变量和实例变量的区别

开发者常常会把所有属性都放在 __init__ 方法中,而没有意识到有些属性应该是类变量,而有些则应该是实例变量。这一区别非常关键:

  • 实例变量 :在 __init__ 中定义,每个实例都有自己独立的实例变量。

  • 类变量 :直接在类中定义,所有实例共享同一个类变量。

class Dog:  species = "Canis familiaris"  # 类变量,所有实例共享  def __init__(self, name, age):    self.name = name  # 实例变量,每个实例独有    self.age = age
dog1 = Dog("Buddy", 5)dog2 = Dog("Molly", 3)print(dog1.species) print(dog2.species)

4. 使用 @classmethod 和 @staticmethod 实现多功能方法

开发者通常认为类中的每个方法都必须以 self 开头,但 Python 提供了 @classmethod @staticmethod 装饰器,让开发者可以创建不需要 self 的方法。这在编写基于类本身而非具体实例的方法时非常有用。

  • @classmethod :将类本身( cls )作为第一个参数,适合用于修改类级别的数据。

  • @staticmethod :类似普通函数,但放在类中以便于组织,不会访问实例或类本身的数据。

class Car:  wheels = 4  # 类变量  @classmethod  def update_wheels(cls, number):    cls.wheels = number  @staticmethod  def honk():    return "Beep beep!"
print(Car.wheels)Car.update_wheels(6)print(Car.wheels)print(Car.honk())

5. 使用 @property 实现更简洁的 Getter 和 Setter

在 Python 中, @property 装饰器可以让开发者更直观地访问和修改属性,而不必单独编写 getter 和 setter 方法。这样不仅让代码更整洁,还能在不增加复杂性的情况下增加灵活性。

class Rectangle:  def __init__(self, width, height):    self._width = width    self._height = height  @property  def area(self):    return self._width * self._height  @property  def width(self):    return self._width  @width.setter  def width(self, value):    if value > 0:      self._width = value    else:      raise ValueError("Width must be positive")
rect = Rectangle(4, 5)print(rect.area)






请到「今天看啥」查看全文